canvas' `drawTextRun` 有什么用?它与 `drawText` 有何不同?

What is the use of canvas' `drawTextRun`? How is it different from `drawText`?

我试图了解 drawTextRun 的用法,但找不到它们与 canvas

中的正常 drawText 有何不同

以下代码

        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 是什么?

显然这个函数 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)

它将产生

但是,如果我们更改上下文长度,(即显示的单词不完整,但它的相邻第一个和最后一个字母未显示)

    private val TEXT = "عربى"

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

会变成下面的样子

总之,同一个字母,上下文不同,写法就不同了。

注意:感谢 https://hencoder.com/ui-1-3/ 阐明了此方法的用法。