/** * 绘制书写行内容区域的参数接口 */ interface DrawNumberWriteContentParams { ctx: RenderingContext; selectedNumber: number; canvasWidth: number; // 逻辑像素宽度 startY: number; // 起始Y坐标 } /** * 绘制数字书写内容区域服务 * 绘制三条书写行,每条行有三条线(上下实线,中间虚线) * 第一行和第二行有数字(第一个黑色实线,后续灰色虚线),第三行空白 */ export function drawNumberWriteContent({ ctx, selectedNumber, canvasWidth, startY, }: DrawNumberWriteContentParams): void { const lineSpacing = 30; // 行间距(三条线之间的间距) const rowHeight = lineSpacing * 2; // 每行的高度(两条实线之间的距离) const rowMargin = 24; // 行与行之间的间距 const leftMargin = 24; // 左边距 const rightMargin = 24; // 右边距 const numberIndent = selectedNumber === 10 ? 12 : 24; // 数字缩进(避免贴边) const numberSpacing = 90; // 数字之间的间距 const numberCount = 6; // 每行数字的数量(第一个实线 + 6个虚线) const fontSize = 76; // 数字字体大小(调整为行高的83%,避免超出上下边线) // 计算每行的起始Y坐标 const rowStartY = startY + 20; // 顶部间距 // 绘制三条书写行 for (let rowIndex = 0; rowIndex < 5; rowIndex++) { const rowY = rowStartY + rowIndex * (rowHeight + rowMargin); const topLineY = rowY; const middleLineY = rowY + lineSpacing; const bottomLineY = rowY + rowHeight; // 绘制上实线(蓝色) ctx.strokeStyle = '#4A90E2'; // 蓝色 ctx.lineWidth = 1; ctx.setLineDash([]); // 实线 ctx.beginPath(); ctx.moveTo(leftMargin, topLineY); ctx.lineTo(canvasWidth - rightMargin, topLineY); ctx.stroke(); // 绘制中间虚线(橙色) ctx.strokeStyle = '#FF8C42'; // 橙色 ctx.lineWidth = 1; ctx.setLineDash([12, 12]); // 虚线模式 ctx.beginPath(); ctx.moveTo(leftMargin, middleLineY); ctx.lineTo(canvasWidth - rightMargin, middleLineY); ctx.stroke(); ctx.setLineDash([]); // 恢复实线模式 // 绘制下实线(蓝色) ctx.strokeStyle = '#4A90E2'; // 蓝色 ctx.lineWidth = 1; ctx.setLineDash([]); // 实线 ctx.beginPath(); ctx.moveTo(leftMargin, bottomLineY); ctx.lineTo(canvasWidth - rightMargin, bottomLineY); ctx.stroke(); // 第一行和第二行绘制数字 if (rowIndex < 3) { const centerY = rowY + lineSpacing; // 数字中心Y坐标(中间虚线位置) for (let i = 0; i < numberCount; i++) { const numberX = leftMargin + numberIndent + i * numberSpacing; if (i === 0) { // 第一个数字:黑色实线 ctx.fillStyle = '#000000'; ctx.font = `bold ${fontSize}px "Microsoft Yahei"`; ctx.textBaseline = 'middle'; ctx.textAlign = 'left'; ctx.fillText(String(selectedNumber), numberX, centerY); } else { // 后续数字:灰色虚线(使用灰色填充配合透明度模拟虚线效果) const savedAlpha = ctx.globalAlpha; ctx.globalAlpha = 0.6; // 设置透明度模拟虚线效果 ctx.fillStyle = '#999999'; // 灰色 ctx.font = `${fontSize}px "Microsoft Yahei"`; ctx.textBaseline = 'middle'; ctx.textAlign = 'left'; ctx.fillText(String(selectedNumber), numberX, centerY); ctx.globalAlpha = savedAlpha; // 恢复透明度 } } } // 第三行不绘制数字(空白行) } }