Запретить рисование персонажа как эможи

Я хочу нарисовать один символ Unicode на холст, используя drawText().

canvas.drawText("\u270c\ufe0e", x, y, paint);

На тестовом устройстве под управлением Android 7 оно отображается правильно:

Correctly drawn character

Но в моем эмуляторе, "работающем" на Android 6 и на реальном устройстве под управлением Android 6, он нарисован как Emoji, независимо от \ufe0e:

Character drawn as Emoji

Это, конечно, не то, что я хочу, так как я хочу, чтобы он был черным, а не розовым! Есть ли способ "отключить" Emojis при рисовании текста?

Ответы

Ответ 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);

Ответ 2

Вы можете попробовать Fontawesome. Вам не нужно будет загружать всю библиотеку. Просто файл ttf с веб-сайта. Это около 18 МБ.

https://fontawesome.com/get-started

Затем вы можете использовать строки в обложке для рисования значков.

https://fontawesome.com/cheatsheet

Скопируйте файл ttf в папку с вашими ресурсами.

Typeface typeface = Typeface.createFromAsset(context.getAssets(),"fontawesome_webfont_4.ttf");
paint.setTypeface(typeface);
canvas.drawText("\uf25b", x, y, paint);

Вы можете найти \uf25b в cheatsheet как f25b. Это символ мира.