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

ลองใช้วิธีเขียน
Jetpack Compose เป็นชุดเครื่องมือ UI ที่แนะนําสําหรับ Android ดูวิธีรองรับอีโมจิในเครื่องมือเขียน

คลังการสนับสนุน 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