Android 如何画一条线来完全对齐文本的顶部?

Android 如何画一条线来完全对齐文本的顶部?,android,fonts,android-canvas,textview,Android,Fonts,Android Canvas,Textview,我能够完美地对齐基线。“GetLineBound将给出与文本完全对齐的基线(下移)。 我正在使用rect.top作为顶线,它将给出一条顶部带有填充的线,请参见屏幕截图 主要的问题是我有不同的字体。这段代码在一些字体上非常有效 这是密码 int baseline = getLineBounds(i, rect); int topLine = rect.top; canvas.drawLine(rect.left - padding, baseline, rect.right + pad

我能够完美地对齐基线。“
GetLineBound
将给出与文本完全对齐的基线(下移)。 我正在使用
rect.top
作为顶线,它将给出一条顶部带有填充的线,请参见屏幕截图

主要的问题是我有不同的字体。这段代码在一些字体上非常有效

这是密码

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获得字体的高度并将其与基线一起添加

 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”

所以我的问题是如何得到像基线一样的背线。
非常感谢您提供的任何帮助。

请再次尝试
绘制.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
(如果它不是一种在圆圈顶部上方的
O
右上角有一点扭曲的脚本字体…)然后为每种字体存储一些小的偏移量,告诉你笔划的线宽有多粗,这样你的线条就会穿过字母的顶部而不是上面。

再次尝试
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
(如果它不是一种在圆圈顶部上方的
O
右上角有一点扭曲的脚本字体…)然后为每个字体存储一些小偏移量,告诉你笔划的线宽有多粗,因此,你的行是在信的顶部,而不是上面。

让我试试这个….+1,谢谢你的时间和解释。它很有效,谢谢。是的,你是对的,小写字母有问题。但我想我能解决。让我试试这个….+1,谢谢你的时间和解释。是的,你是对的,小写字母有问题案例,但我想我能找到答案。