Emoji Uyumluluğu

Yazma yöntemini deneyin
Jetpack Compose, Android için önerilen kullanıcı arayüzü araç setidir. Oluşturma bölümünde emoji desteğini nasıl etkinleştireceğinizi öğrenin.

EmojiCompat destek kitaplığı, Android cihazları en yeni emojilerle güncel tutmayı amaçlar. Bu, uygulamanızın eksik emoji karakterlerini ☐ şeklinde göstermesini engeller. Bu karakter, cihazınızda metni görüntülemek için bir yazı tipi olmadığını gösterir. EmojiCompat destek kitaplığını kullanarak uygulama kullanıcılarınızın en yeni emojileri alabilmek için Android OS güncellemelerini beklemesi gerekmez.

Emoji gösteren cihazlar
1. şekil. Emoji karşılaştırması

Aşağıdaki ilgili kaynaklara göz atın:

EmojiCompat nasıl çalışır?

EmojiCompat Destek kitaplığı, Android 4.4 (API düzeyi 19) ve sonraki sürümleri çalıştıran cihazlarda geriye dönük uyumlu emoji desteği uygulamak için sınıflar sağlar. EmojiCompat, paketlenmiş veya indirilebilir yazı tipleriyle yapılandırabilirsiniz. Yapılandırma hakkında daha fazla bilgi için aşağıdaki bölümlere bakın:

EmojiCompat, belirli bir CharSequence için emojileri tanımlar, gerekirse bunları EmojiSpans ile değiştirir ve son olarak emoji gliflerini oluşturur. Şekil 2'de bu süreç gösterilmektedir.

EmojiCompat süreci
Şekil 2. EmojiCompat süreci

İndirilebilir yazı tipi yapılandırması

İndirilebilir yazı tipleri yapılandırması, emoji yazı tipi indirmek için İndirilebilir Yazı Tipleri destek kitaplığı özelliğini kullanır. Ayrıca, EmojiCompat destek kitaplığının Unicode spesifikasyonunun en son sürümlerine ayak uydurmak için ihtiyaç duyduğu gerekli emoji meta verilerini de günceller.

Destek kitaplığı bağımlılığı ekleme

EmojiCompat destek kitaplığını kullanmak için geliştirme ortamınızda uygulama projenizin sınıf yolu bağımlılıklarını değiştirmeniz gerekir.

Uygulama projenize destek kitaplığı eklemek için:

  1. Uygulamanızın build.gradle dosyasını açın.
  2. Destek kitaplığını dependencies bölümüne ekleyin.

Groovy

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

Kotlin

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

İndirilebilir yazı tipi yapılandırması başlatılıyor

Meta verileri ve yazı tipini yüklemek için EmojiCompat öğesini başlatmanız gerekir. Başlatma işlemi biraz zaman alabileceğinden arka plan iş parçacığında çalışır.

EmojiCompat'ı indirilebilir yazı tipi yapılandırmasıyla başlatmak için aşağıdaki adımları uygulayın:

  1. FontRequest sınıfının bir örneğini oluşturun ve yazı tipi sağlayıcı yetkilisini, yazı tipi sağlayıcı paketini, yazı tipi sorgusunu ve sertifika için karma kümeleri listesini sağlayın. FontRequest hakkında daha fazla bilgi için İndirilebilir Yazı Tipleri dokümanlarındaki İndirilebilir Yazı Tiplerini programatik olarak kullanma bölümüne bakın.
  2. FontRequestEmojiCompatConfig örneği oluşturun ve Context ile FontRequest örneklerini sağlayın.
  3. EmojiCompat yöntemini çağırarak init() öğesini başlatın ve FontRequestEmojiCompatConfig örneğini iletin.
  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. Düzen XML'lerinde EmojiCompat widget'larını kullanın. AppCompat kullanıyorsanız AppCompat ile EmojiCompat widget'larını kullanma bölümüne bakın.
  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"/>

İndirilebilir yazı tipi yapılandırmasıyla EmojiCompat yapılandırma hakkında daha fazla bilgi için Emoji Compatibility örnek uygulaması Java | Kotlin sayfasına gidin.

Kitaplık bileşenleri

EmojiCompat sürecindeki kitaplık bileşenleri
3.şekil EmojiCompat sürecindeki kitaplık bileşenleri
Widget'lar: EmojiEditText, EmojiTextView, EmojiButton
EmojiCompat, TextView, EditText ve Button ile kullanılacak varsayılan widget uygulamaları. EmojiCompat ile TextView, EditText ve Button.
EmojiCompat
Destek kitaplığı için ana herkese açık yüzey. Tüm harici aramaları yapar ve sistemin diğer kısımlarıyla koordineli çalışır.
EmojiCompat.Config
Tek örnek oluşturulacak şekilde yapılandırılır.
EmojiSpan
Karakterleri (diziler) değiştiren ve glifi oluşturan bir ReplacementSpan alt sınıfı.
EmojiCompat Yazı tipi
EmojiCompat, emoji'leri göstermek için bir yazı tipi kullanıyor. Bu yazı tipi, Android Emoji yazı tipinin değiştirilmiş bir sürümüdür. Yazı tipi aşağıdaki gibi değiştirilir:
  • Emoji'lerin oluşturulması için geriye dönük uyumluluk sağlamak amacıyla, tüm emoji karakterleri, Unicode'un U+F0001 ile başlayan Ek Özel Kullanım Alanı-A'sında tek bir Unicode kod noktasıyla temsil edilir.
  • Ek emoji meta verileri, yazı tipine ikili biçimde eklenir ve EmojiCompat tarafından çalışma zamanında ayrıştırılır. Veriler, yazı tipinin meta tablosuna yerleştirilir ve özel etiket Emji kullanılır.

Yapılandırma seçenekleri

EmojiCompat örneğini kullanarak EmojiCompat davranışını değiştirebilirsiniz. Yapılandırmayı ayarlamak için temel sınıftaki aşağıdaki yöntemleri kullanabilirsiniz:

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() {...})

İlk kullanıma hazırlama işleyicileri ekleme

EmojiCompat ve EmojiCompat sınıfları, ilk kullanıma hazırlama geri çağırma işlevini kaydetmek için registerInitCallback() ve unregisterInitCallback() yöntemlerini sağlar. Bu yöntemleri kullanmak için EmojiCompat.InitCallback sınıfının bir örneğini oluşturun. Bu yöntemleri çağırın ve EmojiCompat.InitCallback sınıfının örneğini iletin. EmojiCompat destek kitaplığının ilk kullanıma hazırlama işlemi başarılı olduğunda EmojiCompat sınıfı onInitialized() yöntemini çağırır. Kitaplık başlatılamazsa EmojiCompat sınıfı onFailed() yöntemini çağırır.

Başlatma durumunu istediğiniz zaman kontrol etmek için getLoadState() yöntemini çağırın. Aşağıdaki değerlerden birini döndürür: LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED, veya LOAD_STATE_FAILED.

EmojiCompat'i AppCompat widget'larıyla kullanma

AppCompat widgets kullanıyorsanız AppCompat widgets'den uzanan EmojiCompat widget'larını kullanabilirsiniz.

  1. Destek kitaplığını bağımlılıklar bölümüne ekleyin.

    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. Düzen XML'lerinde EmojiCompat AppCompat Widget widget'larını kullanın.
  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"/>

Paketlenmiş yazı tipleri yapılandırması

EmojiCompat Destek kitaplığı, paketlenmiş yazı tipi sürümünde de kullanılabilir. Bu paket, yerleştirilmiş meta verileri içeren yazı tipini içerir. Pakette, meta verileri ve yazı tiplerini yüklemek için AssetManager kullanan bir BundledEmojiCompatConfig de bulunur.

Not: Yazı tipi boyutu birden fazla megabayttır.

Destek kitaplığı bağımlılığı ekleme

Paketlenmiş yazı tipi yapılandırmasıyla EmojiCompat destek kitaplığını kullanmak için geliştirme ortamınızda uygulama projenizin sınıf yolu bağımlılıklarını değiştirmeniz gerekir.

Uygulama projenize destek kitaplığı eklemek için:

  1. Uygulamanızın build.gradle dosyasını açın.
  2. Destek kitaplığını dependencies bölümüne ekleyin.

Groovy

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

Kotlin

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

EmojiCompat'i yapılandırmak için paketlenmiş yazı tiplerini kullanma

EmojiCompat yapılandırmak için paketlenmiş yazı tiplerini kullanmak üzere aşağıdaki adımları uygulayın:

  1. BundledEmojiCompatConfig kullanarak EmojiCompat örneği oluşturun ve Context örneği sağlayın.
  2. init() yöntemini çağırarak EmojiCompat öğesini başlatın ve BundledEmojiCompatConfig örneğini iletin.

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);
        ...
    }
}

EmojiCompat'i widget'lar olmadan kullanma

EmojiCompat, doğru görüntüleri oluşturmak için EmojiSpan kullanır. Bu nedenle, herhangi bir CharSequence değerini EmojiSpans ile Spanned örneklerine dönüştürmesi gerekir. EmojiCompat sınıfı, CharSequences öğesini EmojiSpans ile Spanned örneklerine dönüştürmek için bir yöntem sağlar. Bu yöntemi kullanarak, işlenmiş örnekleri ham dize yerine işleyip önbelleğe alabilirsiniz. Bu da uygulamanızın performansını artırır.

Kotlin

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

Java

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

IME'ler için EmojiCompat'i kullanma

EmojiCompat Destek kitaplığını kullanarak klavyeler, etkileşimde bulundukları uygulama tarafından desteklenen emojileri oluşturabilir. IME'ler, hasEmojiGlyph() yöntemini kullanarak EmojiCompat öğesinin emoji oluşturup oluşturamayacağını kontrol edebilir. Bu yöntem, CharSequence emoji alır ve EmojiCompat, emojiyi algılayıp oluşturabiliyorsa true değerini döndürür.

Klavye, palet üzerinde hangi emojilerin oluşturulacağını belirlemek için uygulamanın desteklediği EmojiCompat destek kitaplığının sürümünü de kontrol edebilir. Klavye, sürümü kontrol etmek için (varsa) aşağıdaki anahtarların EditorInfo.extras paketinde olup olmadığını kontrol etmelidir:

Klavyeler, EditorInfo.extras paketinde anahtarları aldıktan sonra uygulamanın belirli bir emojiyi oluşturup oluşturamayacağını kontrol etmek için hasEmojiGlyph() yöntemini kullanabilir. Burada metadataVersion, EDITOR_INFO_METAVERSION_KEY değeridir.

EmojiCompat'i özel widget'larla kullanma

Uygulamanızdaki CharSequence öğesini önceden işlemek ve Spanned örneklerini oluşturabilen herhangi bir widget'a (ör. TextView) eklemek için her zaman process() yöntemini kullanabilirsiniz. Ayrıca, EmojiCompat, özel widget'larınızı emoji desteğiyle zenginleştirmenize olanak tanıyan aşağıdaki widget yardımcı sınıflarını sunar.

Örnek 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() {
       ...
   }
}
Örnek 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() {
       ...
   }
}

Sık sorulan sorular

  • Yazı tipi indirme işlemini nasıl başlatırım?
  • Emoji yazı tipleri, cihazda yoksa ilk istekte indirilir. İndirme planlaması uygulama için şeffaftır.

  • İlk kullanıma hazırlama ne kadar sürer?
  • Yazı tipi indirildikten sonra EmojiCompat'nın başlatılması yaklaşık 150 milisaniye sürer.

  • EmojiCompat destek kitaplığı ne kadar bellek kullanır?
  • Şu anda, emojiyi bulmak için kullanılan veri yapısı uygulamanın belleğine yüklenir ve yaklaşık 200 KB yer kaplar.

  • Özel bir TextView için EmojiCompat'i kullanabilir miyim?
  • Evet. EmojiCompat, özel widget'lar için yardımcı sınıflar sağlar. Belirli bir dizeyi önceden işleyip Spanned biçimine dönüştürmek de mümkündür. Widget yardımcı sınıfları hakkında daha fazla bilgi için EmojiCompat'i özel widget'larla kullanma bölümüne bakın.

  • Android 4.4 (API düzeyi 19) veya önceki sürümlerin yüklü olduğu cihazlarda düzen XML'lerine widget eklersem ne olur?
  • Android 4.4 (API düzeyi 19) veya önceki sürümleri çalıştıran cihazları destekleyen uygulamalarınıza EmojiCompat destek kitaplığını ya da bu kitaplığın widget'larını ekleyebilirsiniz. Ancak bir cihaz API düzeyi 19'dan önceki bir Android sürümünde çalışıyorsa EmojiCompat ve widget'ları "işlem yok" durumundaysa Bu, EmojiTextView öğesinin normal bir TextView gibi davrandığı anlamına gelir. EmojiCompat örneği; init() yöntemini çağırdığınızda hemen LOAD_STATE_SUCCEEDED durumuna geçer.

Ek kaynaklar

EmojiCompat kitaplığını kullanma hakkında daha fazla bilgi için EmojiCompat başlıklı videoyu izleyin.