توافق الرموز التعبيرية

تهدف مكتبة دعم EmojiCompat إلى إبقاء أجهزة Android مُحدّثة بأحدث الرموز التعبيرية. ويمنع هذا الرمز تطبيقك من عرض رموز الإيموجي الناقصة على شكل ☐، ما يشير إلى عدم توفّر خط على جهازك لعرض النص. عند استخدام مكتبة دعم EmojiCompat، لن يحتاج مستخدمو التطبيق إلى انتظار تحديثات نظام التشغيل Android للحصول على أحدث الرموز التعبيرية.

الأجهزة التي تعرض رموز الإيموجي
الشكل 1. مقارنة الرموز التعبيرية

يمكنك الاطّلاع على المراجع التالية ذات الصلة:

  • نموذج تطبيق متوافق مع رموز الإيموجي Java | Kotlin

كيف يعمل EmojiCompat؟

توفّر مكتبة دعم EmojiCompat صفوفًا لإتاحة الرموز التعبيرية المتوافقة مع الإصدارات القديمة على الأجهزة التي تعمل بنظام التشغيل Android 4.4 (المستوى 19 من واجهة برمجة التطبيقات) والإصدارات الأحدث. يمكنك ضبط EmojiCompat باستخدام خطوط مضمَّنة أو قابلة للتنزيل. لمزيد من المعلومات عن الإعداد، يمكنك الاطّلاع على الأقسام التالية:

يتعرَّف EmojiCompat على الرموز التعبيرية لـ CharSequence محدّد، ويستبدلها بـ EmojiSpans إذا لزم الأمر، ويعرض أخيرًا الرموز التعبيرية. يوضّح الشكل 2 هذه العملية.

عملية EmojiCompat
الشكل 2. عملية EmojiCompat

إعدادات الخطوط القابلة للتنزيل

تستخدم إعدادات الخطوط القابلة للتنزيل ميزة مكتبة دعم الخطوط القابلة للتنزيل لتنزيل خط رموز تعبيرية. ويُعدّل أيضًا بيانات الإيموجي الوصفية اللازمة التي تحتاجها مكتبة الدعم EmojiCompat لمواكبة أحدث إصدارات مواصفات Unicode.

إضافة مكتبة دعم

لاستخدام مكتبة دعم EmojiCompat، عليك تعديل تبعيات مسار الطباعة لمشروع تطبيقك ضمن بيئة التطوير.

لإضافة مكتبة دعم إلى مشروع تطبيقك، اتّبِع الخطوات التالية:

  1. افتح ملف build.gradle لتطبيقك.
  2. أضِف مكتبة الدعم إلى القسم dependencies.

رائع

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

Kotlin

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

بدء إعداد الخط قابل للتنزيل

عليك إعداد EmojiCompat لتحميل البيانات الوصفية ونوع الخط. بما أنّ عملية الإعداد قد تستغرق بعض الوقت، تتم تنفيذها في سلسلة مهام في الخلفية.

لإعداد EmojiCompat باستخدام إعدادات الخط القابل للتنزيل، اتّبِع الخطوات التالية:

  1. يمكنك إنشاء مثيل للفئة FontRequest وتقديم مرجع موفّر الخط وحزمة موفِّر الخط وطلب البحث الخاص بالخط وقائمة علامات التجزئة الخاصة بالشهادة. لمزيد من المعلومات عن FontRequest، يُرجى الرجوع إلى القسم استخدام الخطوط القابلة للتنزيل آليًا في مستندات الخطوط القابلة للتنزيل.
  2. يمكنك إنشاء مثيل للدالة FontRequestEmojiCompatConfig وتقديم نسخة افتراضية من Context وFontRequest.
  3. يمكنك إعداد EmojiCompat من خلال استدعاء الأسلوب init() وتمرير مثيل 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. استخدِم التطبيقات المصغّرة EmojiCompat في ملفات XML الخاصة بالتصميم إذا كنت تستخدم AppCompat، يُرجى الرجوع إلى القسم استخدام التطبيقات المصغّرة EmojiCompat مع 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"/>

لمزيد من المعلومات حول كيفية ضبط EmojiCompat باستخدام إعدادات الخط قابل للتنزيل ، انتقِل إلى نموذج تطبيق التوافق مع الرموز التعبيرية Java | Kotlin.

مكونات المكتبة

مكوّنات المكتبة في عملية EmojiCompat
الشكل 3. مكوّنات المكتبة في عملية EmojiCompat
التطبيقات المصغّرة: EmojiEditText وEmojiTextView وEmojiButton
عمليات تنفيذ الأدوات التلقائية لاستخدام EmojiCompat مع TextView وEditText وButton.
EmojiCompat
المساحة الرئيسية العلنية لـ "مكتبة الدعم" ويعمل هذا الجزء على تنفيذ كل المكالمات الخارجية والتنسيق مع الأجزاء الأخرى من النظام.
EmojiCompat.Config
تُستخدَم لضبط مثيل العنصر الفردي الذي سيتم إنشاؤه.
EmojiSpan
فئة فرعية ReplacementSpan تستبدل الحرف (التسلسلات) وتعرض الرمز.
الخط "EmojiCompat"
يستخدم
EmojiCompat خطًا لعرض رموز تعبيرية. هذا الخط هو نسخة معدَّلة من خط رموز Android التعبيرية. يتم تعديل الخط على النحو التالي:
  • لتوفير توافق مع الإصدارات القديمة لعرض الرموز التعبيرية، يتم تمثيل جميع رموزها باستخدام نقطة ترميز يونيكود واحدة في "منطقة الاستخدام الخاص الإضافي" (A) في يونيكود، بدءًا من U+F0001.
  • يتم إدراج بيانات وصفية إضافية للرموز التعبيرية بتنسيق ثنائي في الخط ويتم تحليلها أثناء التشغيل بواسطة EmojiCompat. يتم تضمين البيانات في جدول meta للخط، باستخدام العلامة الخاصة Emji.

خيارات الضبط

يمكنك استخدام المثيل EmojiCompat لتعديل سلوك EmojiCompat. يمكنك استخدام methods التالية من الفئة الأساسية لضبط الإعدادات:

  • setReplaceAll(): لتحديد ما إذا كان يجب أن يحل EmojiCompat محل كل الرموز التعبيرية التي يعثر عليها ويحل محلها EmojiSpans وحسب الإعدادات التلقائية، يبذل EmojiCompat قصارى جهده لمعرفة ما إذا كان النظام يمكنه عرض رموز تعبيرية ولا يحلّ محلّها. عند ضبط السياسة على القيمة true، تستبدل EmojiCompat كل الرموز التعبيرية التي يعثر عليها بـ EmojiSpans.
  • setEmojiSpanIndicatorEnabled(): يشير إلى ما إذا كان EmojiCompat قد استبدل رمزًا تعبيريًا برمز EmojiSpan. عند ضبطه على true، ترسم EmojiCompat خلفية ل EmojiSpan. تُستخدَم هذه الطريقة بشكل أساسي لأغراض تصحيح الأخطاء.
  • setEmojiSpanIndicatorColor(): لضبط اللون للإشارة إلى EmojiSpan. تكون القيمة التلقائية GREEN.
  • registerInitCallback: إبلاغ التطبيق بحالة EmojiCompat بدء التشغيل

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

إضافة أدوات معالجة التهيئة

توفّر فئتَا EmojiCompat و EmojiCompat طريقتَي registerInitCallback() و unregisterInitCallback() لتسجيل دالة استدعاء للإعداد. لاستخدام هذه الطرق، يمكنك إنشاء مثيل للفئة EmojiCompat.InitCallback. استخدِم هذه الطُرق وأرسِل مثيل فئة EmojiCompat.InitCallback. عند اكتمال عملية إعداد مكتبة EmojiCompat الداعمة، تستدعي فئة EmojiCompat الطريقة onInitialized(). إذا تعذّر بدء مكتبة ، تستدعي فئة EmojiCompat طريقة onFailed().

للتحقّق من حالة الإعداد في أي وقت، يمكنك استدعاء طريقة getLoadState(). وتعرض إحدى القيم التالية: LOAD_STATE_LOADING أو LOAD_STATE_SUCCEEDED أو LOAD_STATE_FAILED.

استخدام EmojiCompat مع تطبيقات AppCompat المصغّرة

إذا كنت تستخدم AppCompat widgets، يمكنك استخدام تطبيقات EmojiCompat الممتدة من AppCompat widgets.

  1. أضِف مكتبة الدعم إلى قسم الموارد التابعة.

    رائع

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

    Kotlin

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

    رائع

          dependencies {
              implementation "androidx.emoji:emoji-appcompat:$version"
          }
          
  2. استخدِم التطبيقات المصغّرة EmojiCompat AppCompat Widget في ملفات 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"/>

إعدادات الخطوط المجمَّعة

تتوفّر مكتبة دعم EmojiCompat أيضًا في إصدار مُجمَّع للخط. تتضمّن هذه الحزمة الخط مع البيانات الوصفية المضمّنة. تتضمّن الحزمة أيضًا BundledEmojiCompatConfig الذي يستخدم AssetManager لتحميل البيانات الوصفية والخطوط.

ملاحظة: يتم قياس حجم الخط بالميغابايت المتعدّدة.

إضافة تبعية مكتبة الدعم

لاستخدام EmojiCompat مكتبة الدعم مع إعدادات الخطوط المجمّعة، يجب تعديل ملف Classpath لمشروع تطبيقك في بيئة التطوير.

لإضافة مكتبة دعم إلى مشروع تطبيقك:

  1. افتح ملف build.gradle لتطبيقك.
  2. أضِف مكتبة الدعم إلى القسم dependencies.

رائع

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

Kotlin

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

استخدام خطوط مجمّعة لضبط إعدادات EmojiCompat

لاستخدام الخطوط المُضمّنة لضبط EmojiCompat، اتّبِع الخطوات التالية:

  1. استخدِم BundledEmojiCompatConfig لإنشاء مثيل من EmojiCompat وتقديم مثيل Context.
  2. استخدِم الطريقة init() لبدء EmojiCompat وضبط المثيل 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);
        ...
    }
}

استخدام EmojiCompat بدون التطبيقات المصغّرة

يستخدم EmojiCompat EmojiSpan لعرض الصور الصحيحة. لذلك، يجب تحويل أي CharSequence معيّن إلى مثيلات Spanned باستخدام EmojiSpans. توفّر فئة EmojiCompat طريقة ل تحويل CharSequences إلى مثيلات Spanned باستخدام EmojiSpans. باستخدام هذه الطريقة، يمكنك معالجة النماذج التي تمت معالجتها وتخزينها مؤقتًا بدلاً من السلسلة الأولية، ما يؤدي إلى تحسين أداء تطبيقك.

Kotlin

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

Java

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

استخدام EmojiCompat مع أنظمة الكتابة

باستخدام مكتبة دعم EmojiCompat، يمكن للوحات المفاتيح عرض الرموز التعبيرية المتوافقة مع التطبيق الذي تتفاعل معه. يمكن أن تستخدم أنظمة IME الطريقة hasEmojiGlyph() للتحقّق مما إذا كان EmojiCompat قادرًا على عرض رمز تعبيري. تأخذ هذه الطريقة CharSequence من رمز تعبيري وتُعرِض true إذا كان EmojiCompat يمكنه رصد رمز تعبيري وعرضه.

يمكن للوحة المفاتيح أيضًا التحقّق من إصدار EmojiCompat مكتبة الدعم التي يتوافق معها التطبيق لتحديد الرموز التعبيرية التي سيتم عرضها في لوحة الألوان. للتحقّق من إصدار حزمة EditorInfo.extras ، إذا كان متوفّرًا، يجب أن تتحقّق لوحة المفاتيح مما إذا كانت مفاتيح EditorInfo.extras التالية متوفّرة في الحزمة:

  • EDITOR_INFO_METAVERSION_KEY
  • إذا كان المفتاح متوفّرًا في الحزمة، تمثّل القيمة إصدار البيانات الوصفية للرموز التعبيرية التي يستخدمها التطبيق. إذا لم يكن هذا المفتاح متوفّرًا، يعني ذلك أنّ التطبيق لا يستخدم EmojiCompat.

  • EDITOR_INFO_REPLACE_ALL_KEY
  • إذا كان المفتاح متوفّرًا وتم ضبطه على true، يشير ذلك إلى أنّه استدعى التطبيق الأسلوب SetReplaceAll(). لمزيد من المعلومات عن إعداد EmojiCompat، يُرجى الرجوع إلى قسم خيارات الإعداد.

بعد استلام المفاتيح في حِزمة EditorInfo.extras، يمكن للوحة المفاتيح استخدام الأسلوب hasEmojiGlyph() حيث يكون metadataVersion هو قيمة EDITOR_INFO_METAVERSION_KEY، للتحقّق مما إذا كان بإمكان التطبيق عرض رمز تعبيري معيّن.

استخدام EmojiCompat مع التطبيقات المصغّرة المخصّصة

يمكنك في أي وقت استخدام process() لمعالجة CharSequence في تطبيقك مسبقًا وإضافته إلى أي تطبيق مصغّر يمكنه عرض نُسخ Spanned، على سبيل المثال، TextView. بالإضافة إلى ذلك، يقدّم EmojiCompat فئات مساعدة التطبيقات المصغّرة التالية للسماح لك بتحسين التطبيقات المصغّرة المخصّصة من خلال إتاحة رموز الإيموجي بأقل جهد ممكن.

نموذج 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() {
       ...
   }
}
نموذج 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() {
       ...
   }
}

الأسئلة الشائعة

  • كيف يمكنني بدء تنزيل الخط؟
  • ويتم تنزيل خطوط الرموز التعبيرية عند الطلب الأول، إذا لم تكن متوفّرة على الجهاز. تكون عملية جدولة التنزيل شفافة للتطبيق.

  • ما هي المدة التي يستغرقها الإعداد؟
  • بعد تنزيل الخط، يستغرق بدء EmojiCompat حوالي 150 ملي ثانية.

  • ما مقدار الذاكرة التي تستخدمها مكتبة دعم EmojiCompat؟
  • في الوقت الحالي، يتم تحميل بنية البيانات للعثور على الرمز التعبيري في ذاكرة التطبيق وتستهلك هذه البنية حوالي 200 كيلوبايت.

  • هل يمكنني استخدام EmojiCompat لعرض نص مخصّص في TextView؟
  • نعم. توفّر EmojiCompat فئات مساعدة للتطبيقات المصغّرة المخصّصة. من الممكن أيضًا إجراء معالجة مسبقة لسلسلة معيّنة وتحويلها إلى Spanned. لمزيد من المعلومات حول فئات تطبيقات الأدوات المساعدة، ارجع إلى القسم استخدام EmojiCompat مع التطبيقات المصغّرة المخصّصة.

  • ماذا يحدث إذا أضفت تطبيقات مصغّرة في ملفات XML الخاصة بتنسيقات التخطيط على الأجهزة التي تعمل بالإصدار 4.4 من نظام التشغيل Android (المستوى 19 لواجهة برمجة التطبيقات) أو إصدار أقدم؟
  • يمكنك تضمين مكتبة دعم EmojiCompat أو التطبيقات المصغّرة الخاصة بها في تطبيقاتك التي تتوافق مع الأجهزة التي تعمل بالإصدار 4.4 من نظام التشغيل Android (المستوى 19 من واجهة برمجة التطبيقات) أو الإصدارات الأقدم. ومع ذلك، إذا كان الجهاز يعمل بإصدار Android أقدم من المستوى 19 من واجهة برمجة التطبيقات، EmojiCompat تكون التطبيقات المصغّرة فيه في حالة "بدون عملية". وهذا يعني أنّ السمة EmojiTextView تعمل تمامًا مثل TextView العادية. EmojiCompat: يدخل فورًا في حالة LOAD_STATE_SUCCEEDED عند استدعاء الطريقة init().

مصادر إضافية

للحصول على معلومات إضافية عن استخدام مكتبة EmojiCompat ، يمكنك مشاهدة EmojiCompat.