如何绘制一条线以完美地对齐文本的顶部?

时间:2016-08-24 10:31:16

标签: android fonts android-canvas textview

我能够完美地对齐基线。 getLineBounds将提供与文本完美对齐的基线(lineBottom - descent)。 我使用rect.top作为顶线,它会在顶部显示一条填充线,请参阅屏幕截图。

enter image description here

主要问题是我有不同的字体。这段代码在某些字体上效果很好。

这是代码

int baseline = getLineBounds(i, rect);
int topLine =  rect.top;

   canvas.drawLine(rect.left - padding, baseline, rect.right + padding,
                    baseline, paint);

   canvas.drawLine(rect.left - padding, topLine, rect.right + padding, topLine,
                    paint);

   canvas.drawLine(rect.left - padding, (baseline + topLine) / 2, rect.right
                    + padding, (baseline + topLine) / 2, paint1);

这就是我的尝试。

1)使用" StaticLayout"获得最高分但没有任何区别。

2)使用绘画来获取字体的高度并添加基线

 paint.setTextSize(getTextSize());
 paint.setTypeface(getCurrentTypFace());
 paint.getTextBounds(getText().toString(), 0, getText().length(), r);
 int height = r.height();
 int topLine = baseline + height;

3)尝试使用FontPadding = false android:includeFontPadding="false"

所以我的问题是如何像基线一样获得顶线。 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

再次尝试paint.getTextBounds(...),但使用r.top,(或实际为-r.top)代替r.height

paint.setTextSize(getTextSize());
paint.setTypeface(getCurrentTypFace());
paint.getTextBounds(getText().toString(), 0, getText().length(), r);
int ascent = r.top;
int topLine = baseline + ascent;

r.height给出从角色最底部到最顶部的距离,而r.top应该给出从基线到最顶部的距离的负数。

如果这也不起作用,您可能只需要将文本绘制到内存中的临时画布上,然后逐行遍历像素,直到找到一个用于测量上升的黑色文本。

在任何一种情况下,请确保使用包含大写字母的文本。如果您使用仅包含小写字母的文本,则可能会为您提供橙色虚线的坐标。

请注意,这两种方法都会为您提供字体最顶端的像素坐标,而不是笔划的中心。此外,某些字体中的某些字母可能会超出您真正想要绘制的坐标。您最安全的选择可能是选择一个标准字符串进行测量,例如蓝线的大写O和橙色线的小写o(如果它不是脚本-font在O的右上角有一个小的波浪线,它位于圆圈的顶部......)然后为每个字体存储一些小的偏移量,告诉你线宽有多宽中风是,所以你的线条通过字母的顶部而不是它的上方。