安卓:Paint.breakText(...) 准确吗?

5

我有一个视图,画了一个矩形,并在其中放置一行文本。该视图使用断字技术确保没有文本超出矩形范围;它会忽略任何超出矩形的文本。对于某些字符,这种方法很有效,但由'l'和'f'组成的字符串通常会超出矩形范围。因此,我需要一个检查来确定下面的代码是否存在明显的缺陷,或者Paint.breakText(...)可能不准确。

public void onDraw(Canvas canvas)
{
    int MARGIN = 1;
    int BORDER_WIDTH = 1;

    Paint p = new Paint();
    p.setAntiAlias(true);
    p.setTextSize(12);
    p.setTypeface(Typeface.create(Typeface.SERIF, Typeface.NORMAL));

    RectF rect = getRect();

    float maxWidth = rect.width() - MARGIN - BORDER_WIDTH * 2;

    String str = getText();
    char[] chars = str.toCharArray();
    int nextPos = p.breakText(chars, 0, chars.length, maxWidth, null);
    str = str.substring(0, nextPos);

    float textX = MARGIN + BORDER_WIDTH;
    float textY = (float) (Math.abs(p.getFontMetrics().ascent) + BORDER_WIDTH + MARGIN);

    canvas.drawText(str, textX, textY, p);

    p.setStrokeWidth(BORDER_WIDTH);
    p.setStyle(Style.STROKE);

    canvas.drawRect(rect, p);
}
2个回答

10

通过以下操作修复了该问题:Paint.setSubpixelText(true);


0
问题可能出在你绘制矩形的方式上。描边不在矩形外部,一半描边在内部,一半在外部。

我怀疑这不是问题所在。给定的代码假设整个笔画都在矩形内(这是通过“maxWidth”、“textX”和“textY”变量考虑到的)。因此,如果有什么问题,文本应该很可能比预期更早地断开,但永远不应该超出矩形范围。 - ab11
问题在于分数度量(子像素文本)未设置。 - ab11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接