Zgodność emotikonów

Biblioteka pomocy EmojiCompat ma na celu zapewnienie aktualności na urządzeniach z Androidem najnowszych emotikonów. Zapobiega wyświetlaniu w aplikacji brakujących znaków emotikonów w postaci ☐, co oznacza, że na urządzeniu nie ma czcionki do wyświetlenia tekstu. Dzięki bibliotece pomocy EmojiCompat użytkownicy Twojej aplikacji nie muszą czekać na aktualizacje systemu operacyjnego Android, aby otrzymać najnowsze emotikony.

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

Zapoznaj się z tymi powiązanymi materiałami:

  • Przykładowa aplikacja do kompatybilności emotikonów Java | Kotlin

Jak działa emojiCompat?

Biblioteka pomocy EmojiCompat zawiera klasy umożliwiające wdrożenie zgodnych wstecznie obsługi emotikonów na urządzeniach z Androidem 4.4 (poziom interfejsu API 19) lub nowszym. Możesz skonfigurować EmojiCompat, używając czcionek dostępnych w pakiecie lub tych do pobrania. Więcej informacji o konfiguracji znajdziesz w tych sekcjach:

EmojiCompat identyfikuje emotikon w danym elemencie CharSequence, w razie potrzeby zastępuje go EmojiSpans i na koniec renderuje glify emotikonów. Rys. 2 przedstawia cały proces.

Proces kompilacji emotikonów
Rysunek 2. Proces EMMCompat

Konfiguracja czcionek do pobrania

Konfiguracja czcionek do pobrania korzysta z biblioteki obsługi czcionek do pobrania, aby pobrać czcionkę z emotikonami. Zaktualizuje także niezbędne metadane emotikonów, które biblioteka obsługi EmojiCompat musi być zgodna z najnowszymi wersjami specyfikacji Unicode.

Dodawanie zależności biblioteki pomocy

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

Aby dodać bibliotekę pomocy do projektu aplikacji:

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

Odlotowe

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

Kotlin

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

Inicjuję konfigurację czcionki do pobrania

Aby wczytać metadane i krój czcionki, musisz zainicjować EmojiCompat. Ponieważ inicjowanie może trochę potrwać, proces inicjowania jest wykonywany w wątku w tle.

Aby zainicjować EmojiCompat przy użyciu pobieranej konfiguracji czcionki, wykonaj te czynności:

  1. Utwórz instancję klasy FontRequest i podaj urząd dostawcy czcionek, jego pakiet, zapytanie dotyczące czcionki oraz listę zestawów haszy dla certyfikatu. Więcej informacji na temat FontRequest znajdziesz w sekcji Programowe używanie czcionek z możliwością pobierania w dokumentacji Czcionek do pobrania.
  2. Utwórz instancję FontRequestEmojiCompatConfig i udostępnij 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 interfejsu AppCompat, zapoznaj się z sekcją Używanie widżetów emojiCompat w aplikacji 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 tym, jak skonfigurować EmojiCompat przy użyciu konfiguracji czcionki do pobrania, znajdziesz w przykładowej aplikacji zgodności emotikonów 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, które używają EmojiCompat z parametrami TextView, EditText i Button.
EmojiCompat
Główna platforma publiczna biblioteki pomocy. Wykonuje wszystkie połączenia zewnętrzne i współrzędne z innymi częściami systemu.
EmojiCompat.Config
Konfiguruje instancję usługi typu singleton do utworzenia.
EmojiSpan
Podklasa ReplacementSpan, która zastępuje znak (sekwencje) i renderuje glif.
Czcionka: EmojiCompat
EmojiCompat używa czcionki do wyświetlania emotikonów. To zmodyfikowana wersja czcionki emotikonów na Androidzie. Czcionka jest modyfikowana w ten sposób:
  • Aby zapewnić wsteczną kompatybilność z renderowaniem emotikonów, wszystkie znaki emotikonów są reprezentowane za pomocą jednego punktu kodowego Unicode w dodatkowym obszarze A do prywatnego użytku Unicode, zaczynając od U+F0001.
  • Dodatkowe metadane emotikonów są wstawiane do czcionki w formacie binarnym i są analizowane przez usługę EmojiCompat w czasie działania. Dane są umieszczone w tabeli meta czcionki razem z prywatnym tagiem Emji.

Opcje konfiguracji

Za pomocą instancji EmojiCompat możesz zmienić działanie usługi EmojiCompat. Aby ustawić konfigurację, możesz użyć tych metod z klasy podstawowej:

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 detektorów inicjowania

Klasy EmojiCompat i EmojiCompat udostępniają metody registerInitCallback() i unregisterInitCallback() do rejestrowania wywołania zwrotnego inicjowania. Aby użyć tych metod, utwórz instancję klasy EmojiCompat.InitCallback. Wywołaj te metody i przekaż instancję klasy EmojiCompat.InitCallback. Gdy biblioteka obsługi EmojiCompat zostanie zainicjowana, klasa EmojiCompat wywołuje metodę onInitialized(). Jeśli nie uda się zainicjować biblioteki, klasa EmojiCompat wywołuje metodę onFailed().

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

Używanie emojiCompat z widżetami AppCompat

Jeśli używasz AppCompat widgets, możesz używać widżetów EmojiCompat, które rozpoczynają się od AppCompat widgets.

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

    Odlotowe

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

    Kotlin

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

    Odlotowe

          dependencies {
              implementation "androidx.emoji:emoji-appcompat:$version"
          }
          
  2. Używaj EmojiCompat widżetów 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 pomocy EmojiCompat jest też dostępna w pakiecie z czcionkami. Pakiet zawiera czcionkę z osadzonymi metadanymi. Pakiet zawiera też zasób BundledEmojiCompatConfig, który do wczytywania metadanych i czcionek używa AssetManager.

Uwaga: rozmiar czcionki jest podany w wielu megabajtach.

Dodawanie zależności biblioteki pomocy

Aby korzystać z biblioteki pomocy EmojiCompat z powiązaną konfiguracją czcionek, musisz zmodyfikować zależności ścieżki klasy w projekcie aplikacji w środowisku programistycznym.

Aby dodać bibliotekę pomocy do projektu aplikacji:

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

Odlotowe

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

Kotlin

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

Korzystanie z pakietów czcionek w celu skonfigurowania emotikonaCompat

Aby do skonfigurowania EmojiCompat używać czcionek w pakiecie, wykonaj te czynności:

  1. Użyj BundledEmojiCompatConfig, aby utworzyć instancję EmojiCompat i podać instancję 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 Emotikonów bez widżetów

EmojiCompat używa EmojiSpan do renderowania prawidłowych obrazów. Dlatego musi przekonwertować każdą instancję CharSequence na instancję Spanned za pomocą funkcji EmojiSpans. Klasa EmojiCompat udostępnia metodę konwersji CharSequences na instancje Spanned za pomocą EmojiSpans. Za pomocą tej metody możesz przetwarzać przetworzone instancje i zapisywać je w pamięci podręcznej zamiast nieprzetworzonego 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");

Korzystanie z Emotikonów w edytorze IME

Korzystając z biblioteki pomocy EmojiCompat, klawiatury mogą renderować emotikony obsługiwane przez aplikację, z którą wchodzą w interakcję. Edytory IME mogą używać metody hasEmojiGlyph(), by sprawdzić, czy EmojiCompat może renderować emotikon. Ta metoda pobiera CharSequence emotikona i zwraca true, jeśli EmojiCompat może go wykryć i wyświetlić.

Aby określić, który emotikon wyświetlić w palecie, klawiatura może też sprawdzić wersję biblioteki obsługi EmojiCompat obsługiwaną przez aplikację. Aby sprawdzić wersję (jeśli jest dostępna), klawiatura musi sprawdzić, czy w pakiecie EditorInfo.extras są te klawisze:

Po otrzymaniu kluczy z pakietu EditorInfo.extras klawiatura może użyć metody hasEmojiGlyph(), gdzie metadataVersion to wartość EDITOR_INFO_METAVERSION_KEY, aby sprawdzić, czy aplikacja może renderować konkretny emotikon.

Korzystanie z emojiCompat z niestandardowymi widżetami

Zawsze możesz użyć metody process(), aby wstępnie przetworzyć CharSequence w aplikacji i dodać ją do dowolnego widżetu, który może renderować instancje Spanned, np. TextView. Dodatkowo EmojiCompat udostępnia poniższe klasy pomocnicze widżetów, aby przy minimalnym nakładzie pracy wzbogacić niestandardowe widżety o obsługę emotikonów.

Przykładowy 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 tekst 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 emotikonów są pobierane przy pierwszym żądaniu, jeśli nie istnieją na urządzeniu. Harmonogram pobierania jest widoczny dla aplikacji.

  • Ile czasu zajmuje inicjowanie?
  • Gdy pobierzesz czcionkę, zainicjowanie EmojiCompat zajmie około 150 milisekund.

  • Ile pamięci używa biblioteka emotikonów obsługiwana?
  • Struktura danych potrzebnych do znalezienia emotikona jest obecnie wczytywana w pamięci aplikacji i zajmuje około 200 KB.

  • Czy mogę używać emojiCompat jako niestandardowego obiektu TextView?
  • Tak. emojiCompat udostępnia klasy pomocnicze do niestandardowych widżetów. Możesz też wstępnie przetworzyć dany ciąg i przekonwertować go na Spanned. Więcej informacji o klasach pomocniczego widżetu znajdziesz w sekcji Używanie emojiCompat z widżetami niestandardowymi.

  • Co się stanie, jeśli dodam widżety w plikach XML układu na urządzeniach z Androidem 4.4 (poziom interfejsu API 19) lub starszym?
  • Możesz dodać bibliotekę obsługi EmojiCompat lub jej widżety do aplikacji, które obsługują urządzenia z Androidem 4.4 (poziom interfejsu API 19) lub starszym. Jeśli jednak urządzenie korzysta z Androida w wersji starszej niż 19, interfejs EmojiCompat i jego widżety są w stanie „Brak działania”. Oznacza to, że EmojiTextView działa dokładnie tak samo jak zwykły obiekt TextView. instancji EmojiCompat; od razu po wywołaniu metody init() przechodzi do stanu LOAD_STATE_SUCCEEDED.

Dodatkowe materiały

Więcej informacji o korzystaniu z biblioteki EmojiCompat znajdziesz w filmie EmojiCompat.