防止将字符绘制为表情符号

Bow*_*owi 12 unicode android draw emoji android-canvas

我想用一个画布绘制一个unicode字符drawText().

canvas.drawText("\u270c\ufe0e", x, y, paint);
Run Code Online (Sandbox Code Playgroud)

在运行Android 7的测试设备上,它显示正确:

正确绘制的角色

但是在我的模拟器中,"运行"Android 6,并且在运行Android 6的真实设备上,它被绘制为表情符号,无论如何\ufe0e:

作为表情符号绘制的字符

这当然不是我想要的,因为我想把它画成黑色而不是粉红色!有没有办法在绘制文本时"关闭"Emojis?

Leo*_*Aso 1

您可以尝试使用 EmojiCompat 库,如此处此处所述。将其添加到您的依赖项中;

dependencies {
    ...
    implementation "com.android.support:support-emoji:27.1.1"
    implementation "com.android.support:support-emoji-bundled:27.1.1"
    ...
}
Run Code Online (Sandbox Code Playgroud)

初始化库;

dependencies {
    ...
    implementation "com.android.support:support-emoji:27.1.1"
    implementation "com.android.support:support-emoji-bundled:27.1.1"
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后替换TextViewEmojiTextView. 这是一个可以用来测试的示例:

EmojiCompat.init(new BundledEmojiCompatConfig(this).setReplaceAll(true));
Run Code Online (Sandbox Code Playgroud)

如果它不能按您希望的方式工作,请.setReplaceAll(true)从初始化行中删除,然后重试,看看是否有效。

编辑:

如果您想手动将表情符号文本绘制到画布上,您可以使用EmojiCompat.process(...)和 来完成android.text.StaticLayout。我还没有尝试过,所以可能会有错误,但它应该可以工作。

// assuming x, y, and paint are defined
CharSequence emoji = EmojiCompat.get().process("\u270c\ufe0e");
StaticLayout layout = new StaticLayout(emoji, paint, 
    canvas.getWidth(), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
canvas.translate(x, y);
layout.draw(canvas);
canvas.translate(-x, -y);
Run Code Online (Sandbox Code Playgroud)