canvas“drawTextRun”有什么用?它与`drawText`有什么不同?

问题描述 投票:2回答:1

我试着理解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

android canvas text android-canvas drawtext
1个回答
0
投票

显然,这个函数drawTextRun没有用于英语或任何具有不变的字符的语言(例如中文)。

它仅对具有字母的语言有用,这些字母将在其相邻字母存在时发生变化。阿拉伯语是一个很好的例子

请参考阿拉伯语Unicode,https://en.wikipedia.org/wiki/Arabic_script_in_Unicode,其中的语言。

EG

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/揭示了这种方法的用途。

© www.soinside.com 2019 - 2024. All rights reserved.