Запретить рисование персонажа как смайлика - PullRequest
0 голосов
/ 08 июня 2018

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

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

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

Correctly drawn character

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

Character drawn as Emoji

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

Ответы [ 2 ]

0 голосов
/ 17 июня 2018

Вы можете попробовать 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 в коде как f25b.Это значок мира.

0 голосов
/ 11 июня 2018

Вы можете попробовать использовать библиотеку 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);
...