canvas的`drawTextRun`有什么用?与`drawText`有什么不同?

时间:2019-02-27 13:14:48

标签: android canvas text android-canvas drawtext

我尝试了解drawTextRun的用法,但找不到与drawText中普通canvas的区别

以下代码

        canvas.drawTextRun(TEXT,
            0, TEXT.length,
            0, TEXT.length ,
            x, y, false, paint)

        canvas.drawText(TEXT,
            x, y, paint)

产生相同的结果。我尝试围绕0TEXT.length进行游戏,但是除了显示较短的TEXT之外,看不出其他不同之处。

我在https://developer.android.com/reference/kotlin/android/graphics/Canvas.html#drawTextRun%28kotlin.CharArray%2C+kotlin.Int%2C+kotlin.Int%2C+kotlin.Int%2C+kotlin.Int%2C+kotlin.Float%2C+kotlin.Float%2C+kotlin.Boolean%2C+android.graphics.Paint%29中阅读了帮助

它的描述是 Draw a run of text, all in a single direction, with optional context for complex text shaping. 什么是complex text shaping

1 个答案:

答案 0 :(得分:0)

显然,此功能drawTextRun对英语或任何具有不变字符的语言(例如中文)没有用。

仅对字母的字母会因相邻字母的存在而改变的语言很有用。一个很好的例子是阿拉伯语。

请务必参考阿拉伯语Unicode https://en.wikipedia.org/wiki/Arabic_script_in_Unicode,此处使用的语言。

例如

4个字母的阿拉伯语单词عربى。 (注意阿拉伯语是从右到左)

如果单独写的是 ع ر ب ى

请注意,形状本身不同。

使用以下代码

    private val TEXT = "عربى"

    canvas.drawTextRun(TEXT,
        1, TEXT.length - 1,
        1, TEXT.length - 1,
        x, y,
        true, projectResources.paint)

它将产生

enter image description here

但是,如果我们更改上下文长度,(即显示的单词不完整,但是确实没有显示相邻的首字母和尾字母)

    private val TEXT = "عربى"

    canvas.drawTextRun(TEXT,
        1, TEXT.length - 1,
        0, TEXT.length,
        x, y,
        true, projectResources.paint)

如下所示

enter image description here

简而言之,尽管存在相同的字母,但在不同的上下文中,其书写方式也不同。

请注意:感谢https://hencoder.com/ui-1-3/的帮助,以帮助您理解此方法的使用。