ความเข้ากันได้ของอีโมจิ

คลังการสนับสนุน EmojiCompat มีเป้าหมายเพื่ออัปเดตอุปกรณ์ Android ให้ใช้อีโมจิล่าสุดอยู่เสมอ ซึ่งจะป้องกันไม่ให้แอปแสดงอักขระอีโมจิที่ขาดหายไปในรูปแบบ ☐ ซึ่งบ่งบอกว่าอุปกรณ์ของคุณไม่มีแบบอักษรสำหรับแสดงข้อความ เมื่อใช้ไลบรารีการสนับสนุน EmojiCompat ผู้ใช้แอปของคุณจะไม่ต้องรอการอัปเดตระบบปฏิบัติการ Android เพื่อรับอีโมจิล่าสุด

อุปกรณ์ที่แสดงอีโมจิ
รูปที่ 1 การเปรียบเทียบอีโมจิ

โปรดดูแหล่งข้อมูลที่เกี่ยวข้องต่อไปนี้

  • แอปตัวอย่างความเข้ากันได้ของอีโมจิ Java | Kotlin

EmojiCompat ทำงานอย่างไร

ไลบรารีการสนับสนุน EmojiCompat มีคลาสสำหรับใช้รองรับอีโมจิแบบย้อนหลังในอุปกรณ์ที่ใช้ Android 4.4 (API ระดับ 19) ขึ้นไป คุณกําหนดค่า EmojiCompat ได้ด้วยแบบอักษรที่รวมไว้หรือแบบอักษรที่ดาวน์โหลดได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับการกําหนดค่าได้ที่ส่วนต่อไปนี้

EmojiCompat จะระบุอีโมจิสำหรับ CharSequence หนึ่งๆ แล้วแทนที่ด้วย EmojiSpans หากจำเป็น และสุดท้ายจะแสดงผลแบบอักษรอีโมจิ รูปที่ 2 แสดงกระบวนการ

กระบวนการ EmojiCompat
รูปที่ 2 กระบวนการ EmojiCompat

การกำหนดค่าแบบอักษรที่ดาวน์โหลดได้

การกำหนดค่าแบบอักษรที่ดาวน์โหลดได้จะใช้ฟีเจอร์คลังแบบอักษรที่รองรับการดาวน์โหลดเพื่อดาวน์โหลดแบบอักษรอีโมจิ นอกจากนี้ ยังอัปเดตข้อมูลเมตาอีโมจิที่จำเป็นซึ่งไลบรารีสนับสนุน EmojiCompat ต้องใช้ในการติดตามข้อกำหนด Unicode เวอร์ชันล่าสุดด้วย

การเพิ่มการพึ่งพาไลบรารีสนับสนุน

หากต้องการใช้EmojiCompatคลังสนับสนุน คุณจะต้องแก้ไขการพึ่งพา classpath ของโปรเจ็กต์แอปภายในสภาพแวดล้อมการพัฒนา

วิธีเพิ่มไลบรารีสนับสนุนลงในโปรเจ็กต์แอปพลิเคชัน

  1. เปิดไฟล์ build.gradle ของแอปพลิเคชัน
  2. เพิ่มคลังสนับสนุนลงในส่วน dependencies

Groovy

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
กำหนดค่าอินสแตนซ์แบบ Singleton ที่จะสร้างขึ้น
EmojiSpan
ซับคลาส ReplacementSpan ที่แทนที่อักขระ (ลำดับ) และแสดงผลสัญลักษณ์
EmojiCompat แบบอักษร
EmojiCompat ใช้แบบอักษรเพื่อแสดงอีโมจิ แบบอักษรนี้เป็นเวอร์ชันที่แก้ไขแล้วของแบบอักษรอีโมจิของ Android แบบอักษรได้รับการแก้ไขดังนี้
  • อักขระอีโมจิทั้งหมดจะแสดงด้วยจุดโค้ด Unicode เดียวในพื้นที่ใช้งานส่วนตัวเสริม A ของ Unicode โดยเริ่มจาก U+F0001 เพื่อให้แสดงอีโมจิได้ย้อนหลัง
  • ระบบจะแทรกข้อมูลเมตาอีโมจิเพิ่มเติมในรูปแบบไบนารีลงในแบบอักษร และEmojiCompatจะแยกวิเคราะห์ข้อมูลเมตาดังกล่าวเมื่อรันไทม์ ข้อมูลจะฝังอยู่ในตาราง meta ของแบบอักษร โดยมีแท็กส่วนตัว Emji

ตัวเลือกการกําหนดค่า

คุณสามารถใช้อินสแตนซ์ EmojiCompat เพื่อแก้ไขลักษณะการทํางานของ EmojiCompat คุณใช้เมธอดต่อไปนี้จากคลาสฐานเพื่อตั้งค่าการกําหนดค่าได้

  • setReplaceAll(): กำหนดว่า EmojiCompat ควรแทนที่อีโมจิทั้งหมดที่พบด้วย EmojiSpans หรือไม่ โดยค่าเริ่มต้น EmojiCompat จะพยายามอย่างเต็มที่เพื่อทำความเข้าใจว่าระบบแสดงผลอีโมจิได้หรือไม่ และจะไม่แทนที่อีโมจิเหล่านั้น เมื่อตั้งค่าเป็น true ระบบจะแทนที่อีโมจิทั้งหมดที่พบด้วย EmojiCompatEmojiSpans
  • 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() {...})

การเพิ่ม Listener การเริ่มต้น

คลาส 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. เพิ่มไลบรารีสนับสนุนลงในส่วน "Dependency"

    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 ใน 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ไลบรารีสนับสนุน กับการกําหนดค่าแบบอักษรที่รวมไว้ คุณต้องแก้ไขการพึ่งพาเส้นทางคลาสของโปรเจ็กต์แอปภายในสภาพแวดล้อมการพัฒนา

วิธีเพิ่มไลบรารีสนับสนุนลงในโปรเจ็กต์แอปพลิเคชัน

  1. เปิดไฟล์ build.gradle ของแอปพลิเคชัน
  2. เพิ่มคลังสนับสนุนลงในส่วน dependencies

Groovy

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 สำหรับ IME

เมื่อใช้EmojiCompatคลังการสนับสนุน แป้นพิมพ์จะแสดงผลอีโมจิที่แอปพลิเคชันโต้ตอบอยู่รองรับ IME สามารถใช้วิธี hasEmojiGlyph() เพื่อตรวจสอบว่า EmojiCompat แสดงผลอีโมจิได้หรือไม่ เมธอดนี้จะรับ CharSequence ของอีโมจิและแสดงผล true หาก EmojiCompat ตรวจหาและแสดงผลอีโมจิได้

นอกจากนี้ แป้นพิมพ์ยังตรวจสอบเวอร์ชันของEmojiCompatคลังสนับสนุนที่แอปรองรับเพื่อพิจารณาว่าควรแสดงผลอีโมจิใดในจานสี หากต้องการตรวจสอบเวอร์ชัน (หากมี) แป้นพิมพ์ต้องตรวจสอบว่ามีคีย์ต่อไปนี้ในEditorInfo.extras แพ็กเกจหรือไม่

หลังจากได้รับคีย์ในแพ็กเกจ 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() {
       ...
   }
}

คำถามที่พบบ่อย

  • ฉันจะเริ่มต้นการดาวน์โหลดแบบอักษรได้อย่างไร
  • ระบบจะดาวน์โหลดแบบอักษรอีโมจิเมื่อมีการขอเป็นครั้งแรก หากไม่มีแบบอักษรดังกล่าวในอุปกรณ์ แอปจะทราบการตั้งเวลาการดาวน์โหลด

  • การเริ่มต้นใช้เวลานานเท่าใด
  • หลังจากดาวน์โหลดแบบอักษรแล้ว ระบบจะใช้เวลาประมาณ 150 มิลลิวินาทีในการเริ่มต้น EmojiCompat

  • ไลบรารีการสนับสนุน EmojiCompat ใช้หน่วยความจำเท่าใด
  • ปัจจุบันโครงสร้างข้อมูลเพื่อค้นหาอีโมจิจะโหลดอยู่ในหน่วยความจำของแอปและใช้พื้นที่ประมาณ 200 KB

  • ฉันใช้ EmojiCompat สำหรับ TextView ที่กําหนดเองได้ไหม
  • ได้ EmojiCompat มีคลาสตัวช่วยสำหรับวิดเจ็ตที่กำหนดเอง นอกจากนี้ คุณยังประมวลผลสตริงหนึ่งๆ ก่อนแล้วแปลงเป็น Spanned ได้ด้วย ดูข้อมูลเพิ่มเติมเกี่ยวกับคลาสตัวช่วยวิดเจ็ตได้ที่ส่วนการใช้ EmojiCompat กับวิดเจ็ตที่กำหนดเอง

  • จะเกิดอะไรขึ้นหากฉันเพิ่มวิดเจ็ตใน XML เลย์เอาต์ในอุปกรณ์ที่ใช้ Android 4.4 (API ระดับ 19) หรือต่ำกว่า
  • คุณสามารถรวมEmojiCompat ไลบรารีการสนับสนุนหรือวิดเจ็ตของ EmojiCompat ไว้ในแอปพลิเคชันที่รองรับอุปกรณ์ที่ใช้ Android 4.4 (API ระดับ 19) หรือต่ำกว่า อย่างไรก็ตาม หากอุปกรณ์ใช้ Android เวอร์ชันก่อน API ระดับ 19 EmojiCompat วิดเจ็ตจะอยู่ในสถานะ "ไม่มีการดำเนินการ" ซึ่งหมายความว่า EmojiTextView จะทํางานเหมือนกับ TextView ปกติทุกประการ อินสแตนซ์ EmojiCompat จะเข้าสู่สถานะ LOAD_STATE_SUCCEEDED ทันทีที่คุณเรียกใช้เมธอด init()

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ EmojiCompat ได้จากวิดีโอ EmojiCompat