Android画布上居中文本

231
我试图使用以下代码显示文本。 问题是文本水平居中显示不正确。 当我为drawText设置坐标时,它将文本的底部放置在该位置。我希望文本在水平方向上也能居中绘制。
这是一张图片,进一步展示了我的问题: Screenshot
@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.onDraw(canvas);
    //canvas.drawRGB(2, 2, 200);
    Paint textPaint = new Paint();
    textPaint.setARGB(200, 254, 0, 0);
    textPaint.setTextAlign(Align.CENTER);
    textPaint.setTypeface(font);
    textPaint.setTextSize(300);
    canvas.drawText("Hello", canvas.getWidth()/2, canvas.getHeight()/2  , textPaint);
}

20
不要在onDraw事件中声明你的paint对象,它会在每次重绘时重新创建。考虑将其作为私有类变量声明。 - Christopher Rathgeb
10
伙计! 请注明您的图像链接是NSFW! 我并不保守,但我不想在办公室屏幕上出现露胸女性的广告。 - Michael Scheper
5
抱歉,@MichaelScheper,我已经更新了链接! - Sebastian
只是简单回答一下为什么你的文本只水平居中。Paint.Align.CENTER 表示文本将在参考点上水平居中显示。在这里查看注释:https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android11-gsi/graphics/java/android/graphics/Paint.java#530 - BamsBamx
12个回答

1
在我的情况下,我不需要把文本放在画布的中间,而是需要放在一个旋转的轮子上。尽管我必须使用这段代码才能成功:
fun getTextRect(textSize: Float, textPaint: TextPaint, string: String) : PointF {
    val rect = RectF(left, top, right, bottom)
    val rectHeight = Rect()
    val cx = rect.centerX()
    val cy = rect.centerY()

    textPaint.getTextBounds(string, 0, string.length, rectHeight)
    val y = cy + rectHeight.height()/2
    val x = cx - textPaint.measureText(string)/2

    return PointF(x, y)
}

然后我从View类调用这个方法:
private fun drawText(canvas: Canvas, paint: TextPaint, text: String, string: String) {
    val pointF = getTextRect(paint.textSize, textPaint, string)
    canvas.drawText(text, pointF!!.x, pointF.y, paint)
}

0
如果我们正在使用静态布局
mStaticLayout = new StaticLayout(mText, mTextPaint, mTextWidth,
                Layout.Alignment.ALIGN_CENTER, 1.0f, 0, true);

Layout.Alignment.ALIGN_CENTER 这个属性可以实现居中对齐。静态布局还有很多其他的优点。

参考文献:Android 文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接