我怎样才能真正水平居中?

时间:2013-06-15 21:45:12

标签: android fonts alignment

我有一个钢琴应用程序,上面有一些圆形标签,带有音符名称。 这些注释名称需要完全以标签为中心。 我终于想出了如何使用ascentdescent垂直执行此操作。但是,我仍然没有完全确定水平对齐。

主要是关于单个字符的渲染。无论我做什么,一些角色都没有了。它有点,但它就在那里。

注意E例如稍微向右偏离,例如左边的B稍微偏离。

enter image description here enter image description here enter image description here

我在onDraw()中呈现标签,而不是使用自定义视图。我还尝试使用TextView标签的大小并使用Gravity.CENTER,但这给出了相同的结果。另请注意,我也尝试了Align.Center

代码:

usedPaint.setTextAlign(Align.LEFT); //Also tried it with Center
Rect textBounds = new Rect();
usedPaint.getTextBounds(infoText, 0, infoText.length(), textBounds);
float textWidth = usedPaint.measureText(infoText);
canvas.drawText(infoText, circleX - (0.5F * textWidth),  circleY - ((usedPaint.descent() + usedPaint.ascent())/2),
                usedPaint);
canvas.drawRect((circleX - (0.5F* textWidth)), circleY - (0.5F * textBounds.height()), circleX + (0.5F * textWidth), circleY + (0.5F * textBounds.height()), otherPaint);

绘制框的宽度是measureText的结果。在E字符处,您会看到它以某种方式测量左侧的一些空格,使角色偏向右侧。

这是在Android 4.0.3上使用标准字体。使用自定义TTF字体会导致相同类型的问题,但每个字符都会有所不同。

我想知道我还能做些什么? (除了克服它;))

1 个答案:

答案 0 :(得分:0)

中心对齐只需更改canvas.drawText(infoText, circleX - (0.5F * textWidth),... to canvas.drawText(infoText, circleX,...