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

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

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

يُرجى الرجوع إلى المراجع ذات الصلة التالية:

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

كيف يعمل EmojiCompat؟

توفّر مكتبة دعم EmojiCompat فئات لتنفيذ ميزة الرموز التعبيرية المتوافقة مع الإصدارات القديمة على الأجهزة التي تعمل بالإصدار 4.4 من نظام التشغيل Android (المستوى 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 أو التطبيقات المصغّرة فيها في تطبيقاتك المتوافقة مع الأجهزة التي تعمل بنظام التشغيل Android 4.4 (المستوى 19 لواجهة برمجة التطبيقات) أو الإصدارات الأقدم. ومع ذلك، إذا كان الجهاز يعمل بإصدار Android أقدم من المستوى 19 من واجهة برمجة التطبيقات، EmojiCompat تكون التطبيقات المصغّرة فيه في حالة "بدون عملية". وهذا يعني أنّ EmojiTextView يتصرّف تمامًا مثل TextView العادي. مثيل EmojiCompat، يصبح على الفور في حالة LOAD_STATE_SUCCEEDED عند استدعاء الطريقة init().

مصادر إضافية

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