Ответ 1
Вы можете попробовать использовать библиотеку EmojiCompat, описанную здесь и здесь. Добавьте его в свои зависимости;
dependencies {
...
implementation "com.android.support:support-emoji:27.1.1"
implementation "com.android.support:support-emoji-bundled:27.1.1"
...
}
Инициализировать библиотеку;
EmojiCompat.init(new BundledEmojiCompatConfig(this).setReplaceAll(true));
А затем замените TextView
на EmojiTextView
. Вот пример, который вы можете использовать для тестирования:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:ignore="HardcodedText">
<!-- replace -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="TextView - default: \u270c, text: \u270c\ufe0e, emoji: \u270c\ufe0f"/>
<!-- with -->
<android.support.text.emoji.widget.EmojiTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="EmojiTextView - default: \u270c, text: \u270c\ufe0e, emoji: \u270c\ufe0f"/>
</LinearLayout>
Если он не работает, как вы хотели бы, удалите .setReplaceAll(true)
из строки инициализации, повторите попытку и посмотрите, работает ли это.
РЕДАКТИРОВАТЬ:
Если вы хотите нарисовать текст emoji вручную, например, на холст, вы можете сделать это с помощью 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);