Javascript画一个白色的框与一个数字在中心-数字总是有点小康

zbdgwd5y  于 2023-01-24  发布在  Java
关注(0)|答案(1)|浏览(100)

我通过javascript画了一个白色的方框,并想在方框的中心画一个数字,但无论我如何尝试改变位置,数字总是有点偏离:

// Create a canvas element
const canvas = document.getElementsByTagName("canvas")[0]
canvas.width = 150;
canvas.height = 150;

// Get the drawing context
const ctx = canvas.getContext('2d');

drawNumberBox(ctx, 123, 0,0, 100, 100, "arial");

function drawNumberBox(ctx, number, x, y, width, height, fontName) {
        // Draw the white background rectangle
        ctx.fillStyle = 'white';
        ctx.fillRect(x, y, width, height);

        // Set the font and text alignment
        ctx.font = `100px ${fontName}`;
        ctx.textAlign = 'center';
        ctx.textBaseline = 'middle';
        ctx.fillStyle = 'black';

        // Check if the number fits within the box
        while (ctx.measureText(number).width > width) {
          // Decrease the font size until the number fits within the box
          ctx.font = `${parseInt(ctx.font) - 1}px ${fontName}`;
        }

        // Draw the number centered inside the box
        const xPos = x + (width / 2);
   

        const yPos = y + (height / 2)
        ctx.fillText(number, xPos, yPos);
      }
<html><body>
<canvas style="background:blue; border:red solid 2px"/>
</body></html>
lrpiutwd

lrpiutwd1#

this fiddle中,我修改了代码,使用measureText函数的实际边界框属性将文本居中。

fontSize = fontSize *  width / (measure.actualBoundingBoxLeft + measure.actualBoundingBoxRight);
    const xPos = x + (width / 2) + ((measure.actualBoundingBoxLeft - measure.actualBoundingBoxRight) / 2);
    const yPos = y + (height / 2) + ((measure.actualBoundingBoxAscent - measure.actualBoundingBoxDescent) / 2);

更精确的文本宽度是右边界框和左边界框大小之和,并且可以如上所示计算真实中心距渲染点的偏移。
这是必要的,因为字体,甚至使用的特定字符,可能导致实际的边界框不在呈现点的中心。

  • 编辑我在写之前的答案时犯了一个错误,并以错误的方式更新了字体大小。我很累

相关问题