我正在尝试使用下面的代码显示文本 . 问题是文本不是水平居中的 . 当我设置 drawText
的坐标时,它会在此位置设置文本的底部 . 我希望绘制文本,以便文本也水平居中 .
这是一张进一步显示我的问题的图片:
@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);
}
9 回答
请尝试以下方法:
中心 Paint.getTextBounds() :
Paint.Align.CENTER 并不意味着文本的参考点是垂直居中的 . 参考点始终位于基线上 . 那么,为什么不使用 Paint.Align.LEFT ?无论如何,你必须计算参考点 .
Paint.descent() 有缺点,它不考虑真实文本 . Paint.descent() 检索相同的值,无论文本是否包含带有下降的字母 . 这就是我使用 r.bottom 的原因 .
如果API <16,我有problems与 Canvas.getHeight() 这就是我使用 Canvas.getClipBounds(Rect) 的原因 . (不要使用 Canvas.getClipBounds().getHeight() ,因为它为 Rect 分配内存 . )
出于性能原因,您应该在 onDraw() 中使用对象之前对其进行分配 . 由于 drawCenter() 将在 onDraw() 内被调用,因此对象 Rect r 在此处被预先分配为字段 .
我试着将两个顶级答案的代码放入我自己的代码中(2015年8月)并制作了一个截图来比较结果:
文本应位于红色填充矩形的中心 . 我的代码产生白色文本,另外两个代码产生灰色文本(它们实际上是相同的,重叠的) . 灰色文字有点太低,右边有两个 .
这就是我进行测试的方式:
垂直对齐是很困难的,因为文本下降和上升发生了,很多人使用 Paint.getTextBounds() 来检索TextWidth和TextHeight,但它并没有使文本中心非常多 . 在这里我们可以使用 Paint.measureText() 来计算TextWidth,TextHeight我们只是用下降和上升来减去,然后我们得到了最多的方法TextSize,以下工作对彼此来说相当容易 .
顺便说一句,我们强烈建议使用 RectF 而不是 Rect ,因为位置需要更准确的值,根据我的经验,RectF在xhdpi设备上完成顶部和底部偏差只有一个像素,Rect会多两个 .
您的代码正在绘制文本基线的中心,位于视图的中心 . 为了使文本在某个点(x,y)居中,您需要计算文本的中心,并将其放在该点上 .
此方法将绘制以x,y点为中心的文本 . 如果将视图中心传递给它,它将以中心绘制文本 .
我发现以文本为中心的最佳解决方案如下:
我创建了一个方法来简化这个:
rectF是你想要绘制文本的区域,就是这样 . Details
如果我们使用静态布局
Layout.Alignment.ALIGN_CENTER 这将成功 . 静态布局还有很多其他优点 .
参考:Android Documentation
这对我有用:
如果有人发现任何问题,请告诉我
适用于我: textPaint.textAlign = Paint.Align.CENTER 与 textPaint.getTextBounds
结果是: