【问题标题】:Paint.breakText() counts glyphs, not charactersPaint.breakText() 计算字形,而不是字符
【发布时间】:2013-12-03 01:32:44
【问题描述】:

我们的一位开发人员遇到了Paint.breakText()它计算“字符”)实际上计算字形的问题。

想象一下,您只包装了一个单词"fit"。它将适合在线,因此您希望breakText() 返回 3。在某些设备上,它确实如此;在其他情况下,“fi”形成一个连字,breakText() 返回 2。这会导致你画画

fi
t

...这不是你想要的!

有吗

  1. ma​​ke breakText() 计算 Java 字符而不是字形的标志?或者
  2. 一种检测"fi" 将被视为单个字形的方法?

【问题讨论】:

  • 是的,我看到了。但是,你知道,这实际上是相反的问题:“由 'l's 和 'f's 组成的字符串延伸到矩形之外”而不是连字过早断开的字符串。
  • ..如果你只是想计算字符,你不能用 String.length() 吗?
  • 感谢您的帮助,朱利叶斯,但是是什么让您认为 String.length() 有任何相关性?想象一下,您正在尝试缠绕更长的字符串,例如“五个 floozies 固定鱼松饼” - 所有这些连字都会导致类似的问题,但这是一个更糟糕的示例,因为发生错误缠绕的位置将取决于窗口宽度。

标签: android ligature


【解决方案1】:

这似乎不是最理想的,但我们处理它的方式是使用paint.breakText("fit", true, 1000, null) == 2 作为bugExists 标志,然后使用measureText() 来检查结果。

【讨论】:

    【解决方案2】:

    我在这里找到了如何做好:Android: is Paint.breakText(...) inaccurate?

    我的代码是:

    在创建时:

    paintOfText.setSubpixelText(true);
    breakTextNumber = paintOfText.breakText(textToBreak, true,
        maximumSizeOfText, null);
    

    关于渲染类:

    if (breakTextNumber < textToBreak.length()) {
        while (textToBreak.charAt(breakTextNumber) != ' ') {
            breakTextNumber--;
        }
        myCanvas.drawText(textToBreak.substring(0, breakTextNumber),
                placeToDrawX, placeToDrawY, paintOfText);
        myCanvas.drawText(
                textToBreak.substring(breakTextNumber+1),
                placeToDrawX, placeToDrawY2,, paintOfText);
        }
    }
    

    这只是将文本分成两行,用空格切割字符串。 希望对您有所帮助。

    【讨论】:

    • setSubpixelText(true) 在 kitkat 上什么都不做 :(
    猜你喜欢
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 2019-05-09
    • 2011-09-22
    相关资源
    最近更新 更多