【问题标题】:How to draw a line to perfectly align top of a text?如何画一条线以完美对齐文本的顶部?
【发布时间】:2016-12-31 10:37:11
【问题描述】:

我能够完美地对齐基线。 getLineBounds 将提供与文本完全对齐的基线(lineBottom - 下降)。 我使用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"

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

【问题讨论】:

    标签: android fonts android-canvas textview


    【解决方案1】:

    再次尝试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 为您的时间和解释。
    • 它可以工作,谢谢。是的,你是对的,小写字母有问题。但我想我可以解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 2018-03-21
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多