Zgodność emotikonów

Biblioteka pomocy EmojiCompat ma na celu Zadbaj o to, by urządzenia z Androidem zawierały najnowsze emotikony. Uniemożliwia to aplikacji brakujące znaki z emotikonu w formacie ☐, co oznacza, że na urządzeniu nie ma czcionki służącej do wyświetlania tekstu. Według w bibliotece pomocy EmojiCompat, użytkownicy aplikacji nie muszą czekać na aktualizacje systemu operacyjnego Android, emotikon.

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

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

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

Jak działa emojiCompat?

Biblioteka pomocy EmojiCompat zapewnia klas do wdrożenia wstecznej obsługi emotikonów na urządzeniach z Android 4.4 (poziom interfejsu API 19) lub nowszy. Możesz skonfigurować EmojiCompat w pakiecie lub dostępne do pobrania czcionki. Więcej informacji o konfiguracji znajdziesz tutaj: w tych sekcjach:

EmojiCompat identyfikuje emotikon w danym przypadku CharSequence, zastępuje je na EmojiSpans, jeśli jest wymagany, oraz na koniec renderuje glify emotikonów. Rys. 2 przedstawia cały proces.

Proces kompilacji emotikonów
Rysunek 2. Proces przetwarzania emotikonów
.

Konfiguracja czcionek do pobrania

Konfiguracja czcionek do pobrania korzysta z obsługi czcionek do pobrania Biblioteka, aby pobrać czcionkę z emotikonami. Aktualizuje też niezbędne informacje metadanych emotikonu, które EmojiCompat biblioteka pomocy musi być na bieżąco z najnowszymi wersjami Unicode specyfikacji.

Dodawanie zależności biblioteki pomocy

Aby korzystać z biblioteki pomocy EmojiCompat, musisz zmienić zależności ścieżki klasy projektu aplikacji w 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")
}

Inicjowanie czcionki do pobrania konfiguracja

Musisz zainicjować usługę EmojiCompat, aby należy załadować metadane i krój czcionki. Inicjowanie może trochę potrwać, proces inicjowania jest uruchomiony w wątku w tle.

Aby zainicjować interfejs EmojiCompat za pomocą funkcji aby pobrać konfigurację czcionek, wykonaj te czynności:

  1. Tworzenie instancji instancji FontRequest i podaj urząd dostawcy czcionek, jego pakiet, kwerendę czcionki oraz listę zestawów haszy dla certyfikatu. Więcej informacje o: FontRequest, zapoznaj się do Automatyczne korzystanie z czcionek do pobrania w sekcji Czcionki do pobrania. dokumentacji.
  2. Utwórz instancję FontRequestEmojiCompatConfig i dostarcz wystąpienia Context oraz FontRequest
  3. Zainicjuj funkcję EmojiCompat, wywołując metodę init() i przekazywać 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 układzie Pliki XML. Jeśli korzystasz z AppCompat, zapoznaj się z Korzystanie z 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 konfigurowaniu EmojiCompat z czcionką do pobrania konfiguracja, otwórz aplikację przykładową 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 EmojiCompat z 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 (sekwencje) i renderuje glif.
Czcionka: EmojiCompat
EmojiCompat używa czcionki do wyświetlania emotikon. To jest zmodyfikowana wersja czcionki Czcionka emotikonów Androida. Czcionka jest modyfikowana w ten sposób:
  • Aby zapewnić zgodność wsteczną do renderowania emotikonów, wszystkie emotikony są reprezentowane przez jeden punkt kodowy Unicode w Dodatkowy obszar do prywatnego użytku Unicode na poziomie U+F0001.
  • Dodatkowe metadane emotikonów są wstawiane w formacie binarnym do czcionki jest analizowany w czasie działania przez EmojiCompat Dane są w nim umieszczone w tabeli meta czcionki, z tagiem prywatnym Emji

Opcje konfiguracji

Za pomocą instancji EmojiCompat można: zmienić działanie EmojiCompat. Za pomocą te metody z klasy bazowej, aby ustawić konfigurację:

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

EmojiCompat i EmojiCompat zajęć podaj registerInitCallback() oraz unregisterInitCallback() do zarejestrowania wywołania zwrotnego inicjowania. Aby używać tych metod, utwórz wystąpienia EmojiCompat.InitCallback zajęcia. Zadzwoń do nas i przekazywać wystąpienie EmojiCompat.InitCallback zajęcia. Gdy zainicjowanie obsługi EmojiCompat , EmojiCompat klasa nazywa onInitialized() . Jeśli biblioteka nie można zainicjować, EmojiCompat klasa nazywa onFailed() .

Aby sprawdzić stan inicjowania w dowolnym momencie, wywołaj funkcję 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 korzystasz z AppCompat widgets, można używać EmojiCompat widżetów, które rozszerzają 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żyj formatu: EmojiCompat Widżety (AppCompat Widget) w układzie Pliki XML.
  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ż są dostępne w ramach pakietu wersji czcionek. Pakiet ten zawiera czcionkę ze znakiem umieszczone metadane. W skład pakietu wchodzą również: BundledEmojiCompatConfig który do wczytywania metadanych używa AssetManager i czcionki.

Uwaga: czcionka jest wielokrotnością rozmiaru megabajtów.

Dodawanie zależności biblioteki pomocy

Korzystanie z biblioteki pomocy EmojiCompat z pakietem konfiguracji czcionek musisz zmodyfikować ścieżki klasy 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

Korzystanie z pakietów czcionek do konfigurowania EmojiCompat, wykonaj te czynności:

  1. Użyj formatu: BundledEmojiCompatConfig aby utworzyć instancję EmojiCompat i podaj instancję Context.
  2. Wywołaj funkcję init() metoda inicjowania EmojiCompat i przekazać wystąpienie 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

Zastosowania: EmojiCompat EmojiSpan, aby renderować prawidłowe obrazy. Dlatego musi przekonwertować określony element CharSequence na Spanned instancja z EmojiSpans Klasa EmojiCompat udostępnia metodę przekonwertuj CharSequences na Spanned instancji z EmojiSpans Przy użyciu tej metody możesz przetworzyć i buforować przetworzone instancje zamiast nieprzetworzonego ciągu znaków, poprawia 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 daną aplikację z którymi wchodzimy w interakcje. Edytor IME może używać metody hasEmojiGlyph() Metoda sprawdzania, czy EmojiCompat może z renderowaniem emotikonów. Ta metoda zajmuje CharSequence emotikon i zwraca true, jeśli EmojiCompat może wykryć i wyświetlić emotikon.

Klawiatura może też sprawdzić wersję EmojiCompat obsługuje bibliotekę obsługiwaną przez aplikację pozwala określić emotikon do wyrenderowania w palecie. Aby sprawdzić jeśli jest dostępna, klawiatura musi sprawdzić, czy Klucze znajdują się w EditorInfo.extras pakiet:

Po otrzymaniu kluczy do pakiet EditorInfo.extras, klawiatura może używać hasEmojiGlyph() gdzie metadataVersion jest wartością dla argumentu EDITOR_INFO_METAVERSION_KEY, aby sprawdzić, czy aplikacja może renderować konkretny emotikon.

Korzystanie z emojiCompat z niestandardowymi widżetami

W każdej chwili możesz użyć usługi process() do wstępnego przetworzenia CharSequence w aplikacji i dodania do dowolnego widżetu, który może renderować instancje Spanned; w przypadku przykład: TextView. Ponadto EmojiCompat udostępnia ten widżet klas pomocniczych, które pozwalają wzbogacić niestandardowe widżety o obsługę emotikonów. minimalny nakład pracy.

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? .
  • Pobranie czcionki zajmuje około 150 milisekund. aby zainicjować EmojiCompat.

  • Ile pamięci używa biblioteka emotikonów obsługiwana?
  • Obecnie struktura danych potrzebnych do znalezienia emotikona jest wczytywana na karcie i zużywa około 200 KB.

  • Czy mogę używać emojiCompat jako niestandardowego obiektu TextView?
  • Tak. emojiCompat udostępnia klasy pomocnicze do niestandardowych widżetów. Jest także można wstępnie przetworzyć dany ciąg i przekonwertować go na Spanned Aby uzyskać więcej informacji o Asystencie widżetów klas, zapoznaj się z Używanie emojiCompat z niestandardowymi widżetami .

  • Co się stanie, jeśli dodam widżety w plikach XML układu na urządzeniach, które działać na Androidzie 4.4 (poziom interfejsu API 19) lub starszym?
  • Możesz użyć tych informacji: EmojiCompat obsługa biblioteki lub jej widżetów w aplikacjach obsługujących urządzenia; z Androidem 4.4 (poziom interfejsu API 19) lub niższym. Jeśli jednak urządzenie działa na Androidzie w wersji starszej niż API 19, Aplikacja EmojiCompat i jej widżety są w „brak operacji” stanu. Oznacza to, że EmojiTextView działa dokładnie jak zwykły TextView. EmojiCompat instancja; natychmiast wpada w LOAD_STATE_SUCCEEDED gdy wywołujesz funkcję init() .

Dodatkowe materiały

Więcej informacji na temat korzystania z EmojiCompat , obejrzyj EmojiCompat.