Zgodność emotikonów

Biblioteka obsługi EmojiCompat ma na celu aktualizowanie urządzeń z Androidem do najnowszych wersji emoji. Zapobiega to wyświetlaniu w aplikacji brakujących emotikonów w postaci znaku ☐, który wskazuje, że urządzenie nie ma czcionki do wyświetlania tekstu. Dzięki korzystaniu z biblioteki pomocy EmojiCompat użytkownicy aplikacji nie muszą czekać na aktualizacje systemu operacyjnego Android, aby uzyskać dostęp do najnowszych emotikonów.

Urządzenia wyświetlające emotikony
Rysunek 1. Porównanie emotikonów

Zapoznaj się z tymi materiałami:

  • Przykładowa aplikacja sprawdzająca zgodność emotikonów Java | Kotlin

Jak działa EmojiCompat?

Biblioteka pomocnicza EmojiCompat udostępnia klasy do implementacji obsługi emoji z obsługą wsteczną na urządzeniach z Androidem 4.4 (poziom interfejsu API 19) i nowszych. Możesz skonfigurować EmojiCompat za pomocą czcionek w pakiecie lub pobieranych czcionek. Więcej informacji o konfiguracji znajdziesz w tych sekcjach:

EmojiCompat identyfikuje emotikony dla danego elementu CharSequence, zastępuje je EmojiSpans (w razie potrzeby), a na koniec renderuje glif emotikonu. Proces ten przedstawia rysunek 2.

Proces EmojiCompat
Rysunek 2. Proces zgodności z emotikonami

Konfiguracja czcionek do pobrania

Konfiguracja czcionek do pobrania korzysta z biblioteki czcionek do pobrania, aby pobrać czcionkę emotikonów. Aktualizuje też niezbędne metadane emotikonów, których biblioteka obsługi EmojiCompat potrzebuje do obsługi najnowszych wersji specyfikacji Unicode.

Dodawanie zależności od biblioteki wsparcia

Aby korzystać z biblioteki pomocniczej EmojiCompat, musisz zmodyfikować zależności ścieżki klasy projektu aplikacji w środowisku programistycznym.

Aby dodać bibliotekę pomocniczą do projektu aplikacji:

  1. Otwórz plik build.gradle swojej aplikacji.
  2. Dodaj bibliotekę obsługi do sekcji dependencies.

Groovy

dependencies {
    ...
    implementation "androidx.emoji:emoji:28.0.0"
}

Kotlin

dependencies {
    ...
    implementation("androidx.emoji:emoji:28.0.0")
}

Inicjowanie konfiguracji czcionki do pobrania

Aby załadować metadane i czcionkę, musisz zainicjować EmojiCompat. Ponieważ inicjowanie może trochę potrwać, proces inicjowania jest wykonywany w wątku w tle.

Aby zainicjować EmojiCompat z konfiguracją czcionki do pobrania, wykonaj te czynności:

  1. Utwórz instancję klasy FontRequest i podaj autorytet dostawcy czcionek, pakiet dostawcy czcionek, zapytanie dotyczące czcionki oraz listę zestawów haszy dla certyfikatu. Więcej informacji o FontRequest znajdziesz w sekcji Używanie czcionek do pobrania w programie w dokumentacji Czcionki do pobrania.
  2. Utwórz instancję FontRequestEmojiCompatConfig i podaj instancje Context oraz FontRequest.
  3. Zainicjuj EmojiCompat, wywołując metodę init() i przekazując instancję FontRequestEmojiCompatConfig.
  4. Kotlin

    class MyApplication : Application() {
    
        override fun onCreate() {
            super.onCreate()
            val fontRequest = FontRequest(
                    "com.example.fontprovider",
                    "com.example",
                    "emoji compat Font Query",
                    CERTIFICATES
            )
            val config = FontRequestEmojiCompatConfig(this, fontRequest)
            EmojiCompat.init(config)
        }
    }

    Java

    public class MyApplication extends Application {
      @Override
       public void onCreate() {
         super.onCreate();
         FontRequest fontRequest = new FontRequest(
           "com.example.fontprovider",
           "com.example",
           "emoji compat Font Query",
           CERTIFICATES);
         EmojiCompat.Config config = new FontRequestEmojiCompatConfig(this, fontRequest);
         EmojiCompat.init(config);
       }
    }
  5. Używaj widżetów EmojiCompat w plikach XML układu. Jeśli używasz AppCompat, zapoznaj się z sekcją Korzystanie z widżetów EmojiCompat w ramach AppCompat.
  6. <android.support.text.emoji.widget.EmojiTextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    
    <android.support.text.emoji.widget.EmojiEditText
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    
    <android.support.text.emoji.widget.EmojiButton
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>

Więcej informacji o konfigurowaniu EmojiCompat z możliwością pobrania konfiguracji czcionek znajdziesz w próbnej aplikacji Emoji Compatibility w językach: Java | Kotlin.

Komponenty biblioteki

Komponenty biblioteki w procesie EmojiCompat
Rysunek 3. Komponenty biblioteki w procesie EmojiCompat
Widżety: EmojiEditText,EmojiTextView,EmojiButton
Domyślne implementacje widżetów do użycia EmojiCompat z TextView, EditText i Button.
EmojiCompat
Główna publiczna strona biblioteki pomocy. Wykonuje wszystkie zewnętrzne wywołania i współdziała z innymi częściami systemu.
EmojiCompat.Config
Konfiguruje tworzoną instancję typu singleton.
EmojiSpan
Podklasa ReplacementSpan, która zastępuje znak (sekwencje) i renderuje glif.
EmojiCompat Czcionka
EmojiCompat używa czcionki do wyświetlania emotikonów. Ta czcionka jest zmodyfikowaną wersją czcionki emotikonów na Androida. Czcionka jest modyfikowana w ten sposób:
  • Aby zapewnić zgodność wsteczną podczas renderowania emotikonów, wszystkie emotikony są reprezentowane przez pojedynczy punkt kodu Unicode w obszarze uzupełniającym do użytku prywatnego A Unicode, zaczynając od U+F0001.
  • Dodatkowe metadane emotikonów są wstawiane w formacie binarnym do czcionki i przetwarzane w czasie wykonywania przez EmojiCompat. Dane są osadzone w tabeli meta czcionki za pomocą tagu prywatnego Emji.

Opcje konfiguracji

Możesz użyć instancji EmojiCompat, aby zmodyfikować zachowanie EmojiCompat. Aby skonfigurować konfigurację, możesz użyć tych metod z klasy bazowej:

Kotlin

val config = FontRequestEmojiCompatConfig(...)
        .setReplaceAll(true)
        .setEmojiSpanIndicatorEnabled(true)
        .setEmojiSpanIndicatorColor(Color.GREEN)
        .registerInitCallback(object: EmojiCompat.InitCallback() {
            ...
        })

Java

EmojiCompat.Config config = new FontRequestEmojiCompatConfig(...)
       .setReplaceAll(true)
       .setEmojiSpanIndicatorEnabled(true)
       .setEmojiSpanIndicatorColor(Color.GREEN)
       .registerInitCallback(new InitCallback() {...})

Dodawanie odbiorców zdarzeń inicjowania

Klasy EmojiCompatEmojiCompat udostępniają metody registerInitCallback()unregisterInitCallback() do rejestrowania wywołania zwrotnego inicjalizacji. Aby użyć tych metod, utwórz instancję klasy EmojiCompat.InitCallback. Wywołuj te metody i przekaż instancję klasy EmojiCompat.InitCallback. Gdy inicjalizacja biblioteki obsługi EmojiCompat zakończy się pomyślnie, klasa EmojiCompat wywoła metodę onInitialized(). Jeśli biblioteka nie inicjuje się, klasa EmojiCompat wywołuje metodę onFailed().

Aby w dowolnym momencie sprawdzić stan inicjalizacji, wywołaj metodę getLoadState(). Zwraca jedną z tych wartości: LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED lub LOAD_STATE_FAILED.

Korzystanie z EmojiCompat w widżetach AppCompat

Jeśli używasz AppCompat widgets, możesz używać widżetów EmojiCompat, które rozszerzają funkcjonalność AppCompat widgets.

  1. Dodaj bibliotekę wsparcia do sekcji zależności.

    Groovy

    dependencies {
        ...
        implementation "androidx.emoji:emoji-bundled:$version"
    }

    Kotlin

          dependencies {
              implementation("androidx.emoji:emoji-appcompat:$version")
          }
          

    Groovy

          dependencies {
              implementation "androidx.emoji:emoji-appcompat:$version"
          }
          
  2. Używaj widżetów EmojiCompat AppCompat Widget w plikach XML układu.
  3. <android.support.text.emoji.widget.EmojiAppCompatTextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    
    <android.support.text.emoji.widget.EmojiAppCompatEditText
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
    
    <android.support.text.emoji.widget.EmojiAppCompatButton
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>

Konfiguracja czcionek w pakiecie

Biblioteka obsługi EmojiCompat jest też dostępna w wersji pakietu czcionek. Ten pakiet zawiera czcionkę z wbudowanymi metadanymi. Pakiet zawiera też BundledEmojiCompatConfig, który używa AssetManager do wczytywania metadanych i czcionek.

Uwaga: rozmiar czcionki jest podany w megabajtach.

Dodawanie zależności od biblioteki wsparcia

Aby używać biblioteki obsługi EmojiCompat z konfigurowaną czcionką w pakiecie, musisz zmodyfikować zależności classpath projektu aplikacji w środowisku programistycznym.

Aby dodać bibliotekę pomocniczą do projektu aplikacji:

  1. Otwórz plik build.gradle swojej aplikacji.
  2. Dodaj bibliotekę obsługi do sekcji dependencies.

Groovy

dependencies {
    ...
    implementation "androidx.emoji:emoji:28.0.0"
}

Kotlin

dependencies {
    ...
    implementation("androidx.emoji:emoji:28.0.0")
}

Konfigurowanie EmojiCompat za pomocą czcionek w pakiecie

Aby skonfigurować EmojiCompat za pomocą czcionek z pakietu:

  1. Użyj BundledEmojiCompatConfig do utworzenia instancji EmojiCompat i podania instancji Context.
  2. Wywołaj metodę init(), aby zainicjować EmojiCompat i przekazać instancję BundledEmojiCompatConfig.

Kotlin

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        val config = BundledEmojiCompatConfig(this)
        EmojiCompat.init(config)
    }
}

Java

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        EmojiCompat.Config config = new BundledEmojiCompatConfig(this);
        EmojiCompat.init(config);
        ...
    }
}

Korzystanie z EmojiCompat bez widżetów

EmojiCompat używa EmojiSpan do renderowania prawidłowych obrazów. Dlatego musi przekształcić dowolną wartość CharSequence w instancje Spanned z wartością EmojiSpans. Klasa EmojiCompat udostępnia metodę, która za pomocą EmojiSpans zamienia instancje CharSequences na Spanned. Dzięki tej metodzie możesz przetwarzać i przechowywać w pamięci podręcznej przetworzone instancje zamiast surowego ciągu znaków, co zwiększa wydajność aplikacji.

Kotlin

val processed = EmojiCompat.get().process("neutral face \uD83D\uDE10")

Java

CharSequence processed = EmojiCompat.get().process("neutral face \uD83D\uDE10");

Używanie EmojiCompat do klawiatur

Za pomocą biblioteki obsługi EmojiCompat klawiatury mogą renderować emotikony obsługiwane przez aplikację, z którą się komunikują. Interfejsy IME mogą używać metody hasEmojiGlyph(), aby sprawdzić, czy EmojiCompat jest w stanie wyświetlić emotikon. Ta metoda przyjmuje CharSequence emotikona i zwraca true, jeśli EmojiCompat może wykryć i wyrenderować emotikon.

Klawiatura może też sprawdzić wersję biblioteki obsługi EmojiCompat, którą obsługuje aplikacja, aby określić, które emoji ma renderować w palecie. Aby sprawdzić wersję, jeśli jest dostępna, klawiatura musi sprawdzić, czy w pakiecie EditorInfo.extrasznajdują się te klawisze:

Po otrzymaniu kluczy w pakiecie EditorInfo.extras klawiatura może użyć metody hasEmojiGlyph(), gdzie metadataVersion to wartość parametru EDITOR_INFO_METAVERSION_KEY, aby sprawdzić, czy aplikacja może wyświetlić określony emotikon.

Korzystanie z EmojiCompat w widżetach niestandardowych

Zawsze możesz użyć metody process() do wstępnego przetworzenia obiektu CharSequence w aplikacji i dodania go do dowolnego widżetu, który może renderować instancje obiektu Spanned, na przykład TextView. Dodatkowo EmojiCompat udostępnia te klasy pomocnicze widżetów, które umożliwiają wzbogacenie niestandardowych widżetów o obsługę emotikonów przy minimalnym nakładzie pracy.

Przykładowy element TextView

Kotlin

class MyTextView(context: Context) : AppCompatTextView(context) {

    private val emojiTextViewHelper: EmojiTextViewHelper by lazy(LazyThreadSafetyMode.NONE) {
        EmojiTextViewHelper(this).apply {
            updateTransformationMethod()
        }
    }

    override fun setFilters(filters: Array<InputFilter>) {
        super.setFilters(emojiTextViewHelper.getFilters(filters))
    }

    override fun setAllCaps(allCaps: Boolean) {
        super.setAllCaps(allCaps)
        emojiTextViewHelper.setAllCaps(allCaps)
    }
}

Java

public class MyTextView extends AppCompatTextView {
   ...
   public MyTextView(Context context) {
       super(context);
       init();
   }
   ...
   private void init() {
       getEmojiTextViewHelper().updateTransformationMethod();
   }

   @Override
   public void setFilters(InputFilter[] filters) {
       super.setFilters(getEmojiTextViewHelper().getFilters(filters));
   }

   @Override
   public void setAllCaps(boolean allCaps) {
       super.setAllCaps(allCaps);
       getEmojiTextViewHelper().setAllCaps(allCaps);
   }

   private EmojiTextViewHelper getEmojiTextViewHelper() {
       ...
   }
}
Przykładowy element EditText

Kotlin

class MyEditText(context: Context) : AppCompatEditText(context) {

    private val emojiEditTextHelper: EmojiEditTextHelper by lazy(LazyThreadSafetyMode.NONE) {
        EmojiEditTextHelper(this).also {
            super.setKeyListener(it.getKeyListener(keyListener))
        }
    }

    override fun setKeyListener(input: KeyListener?) {
        input?.also {
            super.setKeyListener(emojiEditTextHelper.getKeyListener(it))
        }
    }

    override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection {
        val inputConnection: InputConnection = super.onCreateInputConnection(outAttrs)
        return emojiEditTextHelper.onCreateInputConnection(
                inputConnection,
                outAttrs
        ) as InputConnection
    }
}

Java

public class MyEditText extends AppCompatEditText {
   ...
   public MyEditText(Context context) {
       super(context);
       init();
   }
   ...
   private void init() {
       super.setKeyListener(getEmojiEditTextHelper().getKeyListener(getKeyListener()));
   }

   @Override
   public void setKeyListener(android.text.method.KeyListener keyListener) {
       super.setKeyListener(getEmojiEditTextHelper().getKeyListener(keyListener));
   }

   @Override
   public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
       InputConnection inputConnection = super.onCreateInputConnection(outAttrs);
       return getEmojiEditTextHelper().onCreateInputConnection(inputConnection, outAttrs);
   }

   private EmojiEditTextHelper getEmojiEditTextHelper() {
       ...
   }
}

Najczęstsze pytania

  • Jak rozpocząć pobieranie czcionek?
  • Czcionki emoji są pobierane przy pierwszym żądaniu, jeśli nie są dostępne na urządzeniu. Harmonogram pobierania jest przezroczysty dla aplikacji.

  • Ile trwa inicjowanie?
  • Po pobraniu czcionki inicjowanie EmojiCompat zajmuje około 150 ms.

  • Ile pamięci zajmuje biblioteka obsługi EmojiCompat?
  • Obecnie struktura danych służąca do znajdowania emotikonów jest wczytana do pamięci aplikacji i zajmuje około 200 KB.

  • Czy mogę użyć EmojiCompat w niestandardowym widoku TextView?
  • Tak. EmojiCompat udostępnia pomocnicze klasy dla niestandardowych widżetów. Możesz też przetworzyć dany ciąg znaków i przekształcić go w Spanned. Więcej informacji o klasach pomocniczych widżetów znajdziesz w sekcji Korzystanie z EmojiCompat w przypadku widżetów niestandardowych.

  • Co się stanie, jeśli dodam widżety w pliku XML układu na urządzeniach z Androidem 4.4 (poziom interfejsu API 19) lub starszym?
  • Bibliotekę obsługi EmojiCompatlub jej widżety możesz uwzględnić w aplikacjach obsługujących urządzenia z Androidem 4.4 (poziom interfejsu API 19) lub starszym. Jeśli jednak urządzenie działa na wersji Androida starszej niż poziom interfejsu API 19,EmojiCompat jego widżety są w stanie „brak operacji”. Oznacza to, że EmojiTextView działa dokładnie tak samo jak zwykły TextView. instancja EmojiCompat, która natychmiast przechodzi w stan LOAD_STATE_SUCCEEDED, gdy wywołasz metodę init();

Dodatkowe materiały

Aby dowiedzieć się więcej o korzystaniu z biblioteki EmojiCompat, obejrzyj film EmojiCompat.