Emoji Uyumluluğu

EmojiCompat destek kitaplığı, Android cihazları en son emojilerle güncel tutmayı amaçlar. Uygulamanızın, eksik emoji karakterlerini ☐ biçiminde göstermesini engeller. Bu, cihazınızda metni gösterecek bir yazı tipi olmadığını gösterir. EmojiCompat destek kitaplığı sayesinde uygulama kullanıcılarınızın, en son emojileri almak için Android OS güncellemelerini beklemesi gerekmez.

Emojilerin gösterildiği cihazlar
Şekil 1. Emoji karşılaştırma

Aşağıdaki ilgili kaynakları inceleyin:

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ğini uygulamak için sınıflar sunar. EmojiCompat öğesini paket halinde sunulan 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 emojiyi tanımlar, gerekirse EmojiSpans ile değiştirir ve son olarak emoji gliflerini oluşturur. Şekil 2'de süreç gösterilmiştir.

EmojiCompat işlemi
Şekil 2. EmojiCompat işlemi

İndirilebilir yazı tipleri yapılandırması

İndirilebilir yazı tipleri yapılandırması, bir emoji yazı tipi indirmek için İndirilebilir Yazı Tipleri desteği kitaplığı özelliğini kullanır. Ayrıca EmojiCompat destek kitaplığının, Unicode spesifikasyonunun en yeni sürümlerini desteklemesi için gereken 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.

Modern

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 veriyi ve yazı biçimini yüklemek için EmojiCompat öğesini başlatmanız gerekir. Başlatma biraz zaman alabileceğinden, başlatma işlemi bir arka plan iş parçacığı üzerinde çalıştırılır.

EmojiCompat öğesini 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 sertifika için yazı tipi sağlayıcı yetkisini, yazı tipi sağlayıcı paketini, yazı tipi sorgusunu ve karma gruplarının 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şturup Context ve FontRequest örnekleri sağlayın.
  3. init() yöntemini çağırarak EmojiCompat uygulamasını 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 EmojiCompat widget'larını AppCompat ile 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"/>
    

EmojiCompat öğesini indirilebilir yazı tipi yapılandırmasıyla yapılandırma hakkında daha fazla bilgi edinmek için Emoji Uyumluluğu örnek uygulaması Java | Kotlin bölümüne gidin.

Kitaplık bileşenleri

EmojiCompat işlemindeki kitaplık bileşenleri
Şekil 3. EmojiCompat işlemindeki kitaplık bileşenleri
Widget'lar: EmojiEditText, EmojiTextView, EmojiButton
TextView, EditText ve Button ile birlikte EmojiCompat öğesinin kullanılması için varsayılan widget uygulamaları.
EmojiCompat
Destek kitaplığının herkese açık ana platformu. Tüm harici aramaları gerçekleştirir ve sistemin diğer bölümleriyle koordinasyon sağlar.
EmojiCompat.Config
Oluşturulacak tekil örneği yapılandırır.
EmojiSpan
Karakterin (diziler) yerini alan ve glifi oluşturan bir ReplacementSpan alt sınıfı.
EmojiCompat Yazı Tipi
EmojiCompat, emojileri göstermek için yazı tipi kullanıyor. Bu yazı tipi, Android Emoji yazı tipinin değiştirilmiş bir sürümüdür. Yazı tipi şu şekilde değiştirilir:
  • Emoji oluşturmak 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ı'nda tek bir Unicode kod noktasıyla temsil edilir.
  • Ekstra emoji meta verileri, yazı tipine ikili biçimde eklenir ve çalışma zamanında EmojiCompat tarafından ayrıştırılır. Veriler, yazı tipinin meta tablosuna Emji özel etiketiyle yerleştirilir.

Yapılandırma seçenekleri

EmojiCompat davranışını değiştirmek için EmojiCompat örneğini kullanabilirsiniz. Yapılandırmayı ayarlamak için temel sınıfta yer alan 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() {...})

Başlatma işleyicileri ekleme

EmojiCompat ve EmojiCompat sınıfları, başlatma geri çağırması kaydetmek için registerInitCallback() ve unregisterInitCallback() yöntemleri 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ığı başarıyla başlatıldığında 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.

Herhangi bir noktada başlatma durumunu kontrol etmek için getLoadState() yöntemini çağırın. Şu değerlerden birini döndürür: LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED veya LOAD_STATE_FAILED.

EmojiCompat'ı AppCompat widget'larıyla kullanma

AppCompat widgets kullanıyorsanız AppCompat widgets kapsamındaki EmojiCompat widget'ları kullanabilirsiniz.

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

    Modern

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

    Kotlin

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

    Modern

          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"/>
    

Gruplandırılmış yazı tipleri yapılandırması

EmojiCompat destek kitaplığı, paket halinde sunulan bir yazı tipi sürümüyle de kullanılabilir. Bu paket, yerleşik meta verilere sahip yazı tipini içerir. Paket, meta verileri ve yazı tiplerini yüklemek için AssetManager öğesini kullanan bir BundledEmojiCompatConfig de içerir.

Not: Yazı tipi boyutu birden çok megabayt cinsindendir.

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.

Modern

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

Kotlin

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

EmojiCompat'ı yapılandırmak için gruplandırılmış yazı tiplerini kullanma

EmojiCompat yapılandırmasında paket haline getirilmiş yazı tiplerini kullanmak için aşağıdaki adımları uygulayın:

  1. EmojiCompat örneği oluşturmak ve Context örneği sağlamak için BundledEmojiCompatConfig kullanın.
  2. EmojiCompat uygulamasını başlatmak ve BundledEmojiCompatConfig örneğini iletmek için init() yöntemini çağırın.

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'ı widget'lar olmadan kullanma

EmojiCompat, doğru resimleri oluşturmak için EmojiSpan kullanır. Dolayısıyla, belirli bir CharSequence öğesini EmojiSpans ile Spanned örneğine dönüştürmelidir. EmojiCompat sınıfı, CharSequences değerini EmojiSpans ile Spanned örneğine dönüştürmek için bir yöntem sunar. Bu yöntemi kullanarak ham dize yerine işlenen örnekleri işleyip önbelleğe alabilirsiniz. Böylece uygulamanızın performansı artar.

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'ı Kullanma

Klavyeler, EmojiCompat destek kitaplığını kullanarak etkileşimde bulundukları uygulamanın desteklediği emojileri oluşturabilir. IME'ler, EmojiCompat uygulamasının emoji oluşturup oluşturamayacağını kontrol etmek için hasEmojiGlyph() yöntemini kullanabilir. Bu yöntem, bir emojinin CharSequence kadarını alır ve EmojiCompat emojiyi algılayıp oluşturabiliyorsa true değerini döndürür.

Klavye, tarayıcıda hangi emojilerin oluşturulacağını belirlemek için uygulamanın desteklediği EmojiCompat destek kitaplığının sürümünü de kontrol edebilir. Sürümü kontrol etmek için varsa klavyenin aşağıdaki tuşların EditorInfo.extras paketinde yer alıp almadığını kontrol etmesi gerekir:

EditorInfo.extras paketindeki tuşları aldıktan sonra klavye, uygulamanın belirli bir emoji oluşturup oluşturamayacağını kontrol etmek için hasEmojiGlyph() yöntemini kullanabilir. Burada metadataVersion, EDITOR_INFO_METAVERSION_KEY değeridir.

EmojiCompat'ı özel widget'larla kullanma

Uygulamanızda CharSequence öğesini ön işleme almak ve Spanned örneklerini oluşturabilen herhangi bir widget'a (örneğin, TextView) eklemek için her zaman process() yöntemini kullanabilirsiniz. Ayrıca EmojiCompat, minimum çabayla emoji desteğiyle özel widget'larınızı zenginleştirmenizi sağlamak için aşağıdaki widget yardımcı sınıflarını sunar.

Örnek Metin Görünümü

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 Düzenleme Metni

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şlatabilirim?
  • Cihazda bulunmayan emoji yazı tipleri ilk istek üzerine indirilir. İndirme planlaması uygulama açısından şeffaftır.

  • İlk kullanıma hazırlama ne kadar sürüyor?
  • Yazı tipi indirildikten sonra EmojiCompat öğesinin 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üklenmiştir ve yaklaşık 200 KB kullanır.

  • EmojiCompat'i özel bir TextView için kullanabilir miyim?
  • Evet. EmojiCompat, özel widget'lar için yardımcı sınıflar sunar. Belirli bir dizeyi ön işlemden geçirerek 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'ı özel widget'larla kullanma bölümüne bakın.

  • Android 4.4 (API düzeyi 19) veya önceki sürümleri üzerinde çalışan 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ı veya widget'larını ekleyebilirsiniz. Bununla birlikte, bir cihaz API düzeyi 19'dan önceki bir Android sürümünde çalışıyorsa EmojiCompat ve widget'ları "işlem yok" durumunda olur. Bu, EmojiTextView öğesinin tam olarak normal bir TextView gibi davrandığı anlamına gelir. EmojiCompat örneğini çağırın; 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 videosunu izleyin.