如何垂直对齐文本?以 和 为中心的示例:cxcy为什么工作原理不一样?height()/2f

2022-08-31 20:41:42

目标:Android >= 1.6 在纯画布上。

假设我想编写一个函数,该函数将绘制一个(宽度,高度)红色大矩形,然后在其中绘制一个黑色的Hello World文本。我希望文本在视觉上位于矩形的中心。所以让我们试试:

void drawHelloRectangle(Canvas c, int topLeftX, 
        int topLeftY, int width, int height) {
    Paint mPaint = new Paint();
    // height of 'Hello World'; height*0.7 looks good
    int fontHeight = (int)(height*0.7);

    mPaint.setColor(COLOR_RED);
    mPaint.setStyle(Style.FILL);
    c.drawRect( topLeftX, topLeftY, topLeftX+width, topLeftY+height, mPaint);

    mPaint.setTextSize(fontHeight);
    mPaint.setColor(COLOR_BLACK);
    mPaint.setTextAlign(Align.CENTER);
    c.drawText( "Hello World", topLeftX+width/2, ????, mPaint);
}

现在我不知道在drawText的参数中放置什么,标记为,即我不知道如何垂直对齐文本。????

类似的东西

????= topLeftY + height/2 + fontHeight/2 - fontHeight/8;

看起来或多或少工作还行,但一定有更好的方法。


答案 1

以 和 为中心的示例:cxcy

private final Rect textBounds = new Rect(); //don't new this up in a draw method

public void drawTextCentred(Canvas canvas, Paint paint, String text, float cx, float cy){
  paint.getTextBounds(text, 0, text.length(), textBounds);
  canvas.drawText(text, cx - textBounds.exactCenterX(), cy - textBounds.exactCenterY(), paint);
}

为什么工作原理不一样?height()/2f

exactCentre() = (top + bottom) / 2f.

height()/2f = (bottom - top) / 2f

这些只会在 is 时产生相同的结果。对于所有大小的某些字体或某些大小的其他字体,情况可能就是如此,但对于所有大小的所有字体,情况可能并非如此。top0


答案 2
textY = topLeftY + height/2 - (mPaint.descent() + mPaint.ascent()) / 2

从“基线”到“中心”的距离应为-(mPaint.descent() + mPaint.ascent()) / 2


推荐