Emoji Uyumluluğu

EmojiCompat destek kitaplığı, Android cihazların en yeni emojilerle güncel kalmasını amaçlar. Uygulamanızın, eksik emoji karakterlerini ☐ şeklinde göstermesini önler. Bu, cihazınızda metni gösterecek bir yazı tipinin olmadığını gösterir. EmojiCompat destek kitaplığını kullanarak, uygulama kullanıcılarınızın en yeni emojileri almak için Android OS güncellemelerini beklemesi gerekmez.

Emoji gösteren cihazlar
Şekil 1. 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ğini 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 emojiyi tanımlar, gerekirse EmojiSpans ile değiştirir ve nihayet emoji gliflerini oluşturur. Şekil 2'de bu süreç gösterilmektedir.

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

İndirilebilir yazı tipleri yapılandırması

İndirilebilir yazı tipleri yapılandırması, emoji yazı tipini 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ümlerini takip edebilmesi için gereken emoji meta verilerini de günceller.

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

EmojiCompat destek kitaplığını kullanmak için uygulama projenizin sınıf yolu bağımlılıkları üzerinde geliştirme ortamınızda değişiklik yapmanız 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ını başlatma

Meta verileri ve yazı tipini yüklemek için EmojiCompat öğesini başlatmanız gerekir. Başlatma işlemi biraz zaman alabileceğinden, başlatma işlemi 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 oluşturma grubu listesini sağlayın. FontRequest hakkında daha fazla bilgi için İndirilebilir Yazı Tipleri dokümanlarında İndirilebilir Yazı Tiplerini Programatik Olarak Kullanma bölümüne bakın.
  2. FontRequestEmojiCompatConfig sınıfının bir örneğini oluşturun ve Context ile FontRequest sınıflarının örneklerini sağlayın.
  3. init() yöntemini çağırarak EmojiCompat'ü 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. EmojiCompat widget'larını düzen XML'lerinde 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'ü indirilebilir yazı tipi yapılandırmasıyla nasıl yapılandıracağınız hakkında daha fazla bilgi edinmek için Emoji Uyumluluğu örnek uygulamasına Java | Kotlin gidin.

Kitaplık bileşenleri

EmojiCompat sürecindeki kitaplık bileşenleri
Şekil 3. EmojiCompat sürecindeki kitaplık bileşenleri
Widget'lar: EmojiEditText, EmojiTextView, EmojiButton
TextView, EditText ve Button ile birlikte EmojiCompat kullanılacak varsayılan widget uygulamaları.
EmojiCompat
Destek kitaplığının herkese açık ana yüzeyi. 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
Karakteri (dizeleri) değiştiren ve karakteri gösteren bir ReplacementSpan alt sınıfı.
EmojiCompat Yazı tipi
EmojiCompat, emojileri göstermek için bir yazı tipi kullanır. Bu yazı tipi, Android Emoji yazı tipinin değiştirilmiş bir sürümüdür. Yazı tipi aşağıdaki şekilde değiştirilir:
  • Emoji oluşturmak için geriye dönük uyumluluk sağlamak amacıyla tüm emoji karakterleri, U+F0001 ile başlayan Unicode'un Ek Özel Kullanım Alanı-A'da 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, Emoji özel etiketiyle birlikte yazı tipinin meta tablosuna 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ı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ı, bir ilk başlatma geri çağırma işlevi kaydetme 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ığının ilk kullanıma hazırlanması 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.

İstediğiniz zaman başlatma durumunu 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 gelen 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. EmojiCompat AppCompat Widget widget'larını yerleşim XML'lerinde 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ı tipi yapılandırması

EmojiCompat destek kitaplığı, paketlenmiş yazı tipi sürümünde de mevcuttur. 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 megabayt cinsindendir.

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

EmojiCompat destek kitaplığını paketlenmiş yazı tipi yapılandırmasıyla kullanmak için uygulama projenizin geliştirme ortamınızdaki 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 isterseniz 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 sınıfını başlatmak ve BundledEmojiCompatConfig sınıfının örneğini iletmek için init() sınıfının 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'i widget'lar olmadan kullanma

EmojiCompat, doğru resimleri oluşturmak için EmojiSpan kullanır. Bu nedenle, belirli bir CharSequence değerini EmojiSpans ile Spanned örneklerine dönüştürmesi gerekir. EmojiCompat sınıfı, EmojiSpans ile CharSequences öğelerini Spanned örneklerine dönüştürmek için bir yöntem sağlar. Bu yöntemi kullanarak, işlenmemiş dize yerine işlenen örnekleri işleyebilir ve ö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

Klavyeler, EmojiCompat destek kitaplığını kullanarak etkileşimde bulundukları uygulama tarafından desteklenen emojileri oluşturabilir. IME'ler, EmojiCompat'un emoji oluşturma yeteneği olup olmadığını kontrol etmek için hasEmojiGlyph() yöntemini kullanabilir. Bu yöntem, bir emojinin CharSequence değerini alır ve EmojiCompat emojiyi algılayıp oluşturabiliyorsa true değerini döndürür.

Klavye, palette hangi emojinin oluşturulacağını belirlemek için EmojiCompat destek kitaplığının uygulama tarafından desteklenen sürümünü de kontrol edebilir. Klavyenin, sürümünü kontrol etmek için (varsa) EditorInfo.extras paketinde aşağıdaki anahtarların bulunup bulunmadığını kontrol etmesi gerekir:

Klavye, EditorInfo.extras paketindeki anahtarları aldıktan sonra, uygulamanın belirli bir emojiyi oluşturup oluşturamayacağını kontrol etmek için hasEmojiGlyph() yöntemini kullanabilir. Bu yöntemde metadataVersion, EDITOR_INFO_METAVERSION_KEY değerini temsil eder.

EmojiCompat'i özel widget'larla kullanma

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

Ö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 istek üzerine indirilir. İndirme planlaması uygulama için şeffaftır.

  • İlk kullanıma hazırlama işlemi ne kadar sürer?
  • Yazı tipi indirildikten sonra EmojiCompat'ü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 kullanır.

  • Özel 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şlemek ve Spanned olarak 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 daha eski sürümleri çalıştıran cihazlarda düzen XML'lerine widget eklersem ne olur?
  • EmojiCompat destek kitaplığını veya widget'larını, Android 4.4 (API düzeyi 19) veya daha eski sürümleri çalıştıran cihazları destekleyen uygulamalarınıza dahil edebilirsiniz. Ancak bir cihaz API düzeyi 19'dan önceki bir Android sürümünü çalıştırıyorsa EmojiCompat ve widget'ları "işlem yok" durumundaysa Bu, EmojiTextView'ün tam olarak 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

Kitaplığı kullanma hakkında daha fazla bilgi edinmek için EmojiCompat EmojiCompat videosunu izleyin.