คลังการสนับสนุน EmojiCompat
มีเป้าหมายเพื่ออัปเดตอุปกรณ์ Android ให้ใช้อีโมจิล่าสุดอยู่เสมอ ซึ่งจะป้องกันไม่ให้แอปแสดงอักขระอีโมจิที่ขาดหายไปในรูปแบบ ☐ ซึ่งบ่งบอกว่าอุปกรณ์ของคุณไม่มีแบบอักษรสำหรับแสดงข้อความ เมื่อใช้EmojiCompat
ไลบรารีสนับสนุน ผู้ใช้แอปของคุณจะไม่ต้องรอการอัปเดตระบบปฏิบัติการ Android เพื่อรับอีโมจิล่าสุด
โปรดดูแหล่งข้อมูลที่เกี่ยวข้องต่อไปนี้
EmojiCompat ทำงานอย่างไร
ไลบรารีการสนับสนุน EmojiCompat
มีคลาสสำหรับใช้รองรับอีโมจิแบบย้อนหลังในอุปกรณ์ที่ใช้ Android 4.4 (API ระดับ 19) ขึ้นไป คุณกําหนดค่า EmojiCompat
ได้ด้วยแบบอักษรที่รวมไว้หรือแบบอักษรที่ดาวน์โหลดได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับการกําหนดค่าได้ที่ส่วนต่อไปนี้
EmojiCompat
จะระบุอีโมจิสำหรับ CharSequence
หนึ่งๆ แล้วแทนที่ด้วย EmojiSpans
หากจำเป็น และสุดท้ายจะแสดงผลแบบอักษรอีโมจิ รูปที่ 2 แสดงกระบวนการ
การกำหนดค่าแบบอักษรที่ดาวน์โหลดได้
การกำหนดค่าแบบอักษรที่ดาวน์โหลดได้จะใช้ฟีเจอร์คลังแบบอักษรที่รองรับการดาวน์โหลดเพื่อดาวน์โหลดแบบอักษรอีโมจิ นอกจากนี้ ยังอัปเดตข้อมูลเมตาอีโมจิที่จำเป็นซึ่งไลบรารีสนับสนุน EmojiCompat
ต้องใช้ในการติดตามข้อกำหนด Unicode เวอร์ชันล่าสุดด้วย
การเพิ่มการพึ่งพาไลบรารีสนับสนุน
หากต้องการใช้EmojiCompat
คลังสนับสนุน คุณจะต้องแก้ไขการพึ่งพา classpath ของโปรเจ็กต์แอปภายในสภาพแวดล้อมการพัฒนา
วิธีเพิ่มไลบรารีสนับสนุนลงในโปรเจ็กต์แอปพลิเคชัน
- เปิดไฟล์
build.gradle
ของแอปพลิเคชัน - เพิ่มคลังสนับสนุนลงในส่วน
dependencies
Groovy
dependencies { ... implementation "androidx.emoji:emoji:28.0.0" }
Kotlin
dependencies { ... implementation("androidx.emoji:emoji:28.0.0") }
กำลังเริ่มต้นการกำหนดค่าแบบอักษรที่ดาวน์โหลดได้
คุณต้องเริ่มต้น EmojiCompat
เพื่อโหลดข้อมูลเมตาและแบบอักษร เนื่องจากการเริ่มต้นอาจใช้เวลาสักครู่ กระบวนการเริ่มต้นจึงทำงานบนเธรดเบื้องหลัง
หากต้องการเริ่มต้น EmojiCompat
ด้วยการกำหนดค่าแบบอักษรที่ดาวน์โหลดได้ ให้ทำตามขั้นตอนต่อไปนี้
- สร้างอินสแตนซ์ของคลาส
FontRequest
และระบุสิทธิ์ของผู้ให้บริการแบบอักษร แพ็กเกจผู้ให้บริการแบบอักษร การค้นหาแบบอักษร และรายการชุดแฮชสําหรับใบรับรอง ดูข้อมูลเพิ่มเติมเกี่ยวกับFontRequest
ได้ที่ส่วนการใช้แบบอักษรที่ดาวน์โหลดได้ในโปรแกรมในเอกสารประกอบแบบอักษรที่ดาวน์โหลดได้ - สร้างอินสแตนซ์ของ
FontRequestEmojiCompatConfig
และระบุอินสแตนซ์ของContext
และFontRequest
- เริ่มต้น
EmojiCompat
โดยการเรียกใช้เมธอดinit()
และส่งอินสแตนซ์ของFontRequestEmojiCompatConfig
- ใช้วิดเจ็ต
EmojiCompat
ใน XML ของเลย์เอาต์ หากคุณใช้AppCompat
ให้ดูส่วนการใช้วิดเจ็ต EmojiCompat กับ AppCompat
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); } }
<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
ส่วนประกอบของไลบรารี
- วิดเจ็ต:
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
ระบบจะแทนที่อีโมจิทั้งหมดที่พบด้วย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() {...})
การเพิ่ม 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
ได้
- เพิ่มไลบรารีสนับสนุนลงในส่วน "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" }
- ใช้วิดเจ็ต
EmojiCompat
AppCompat Widget
ใน XML ของเลย์เอาต์
<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
ไลบรารีสนับสนุน
กับการกําหนดค่าแบบอักษรที่รวมไว้ คุณต้องแก้ไข Dependency ของ Class Path ของโปรเจ็กต์แอปภายในสภาพแวดล้อมการพัฒนา
วิธีเพิ่มไลบรารีสนับสนุนลงในโปรเจ็กต์แอปพลิเคชัน
- เปิดไฟล์
build.gradle
ของแอปพลิเคชัน - เพิ่มคลังสนับสนุนลงในส่วน
dependencies
Groovy
dependencies { ... implementation "androidx.emoji:emoji:28.0.0" }
Kotlin
dependencies { ... implementation("androidx.emoji:emoji:28.0.0") }
การใช้แบบอักษรที่รวมไว้เพื่อกำหนดค่า EmojiCompat
หากต้องการใช้แบบอักษรที่รวมไว้เพื่อกำหนดค่า
EmojiCompat
ให้ทำตามขั้นตอนต่อไปนี้
- ใช้
BundledEmojiCompatConfig
เพื่อสร้างอินสแตนซ์ของEmojiCompat
และระบุอินสแตนซ์ของContext
- เรียกใช้เมธอด
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
แพ็กเกจหรือไม่
EDITOR_INFO_METAVERSION_KEY
EDITOR_INFO_REPLACE_ALL_KEY
หากคีย์อยู่ในแพ็กเกจ ค่าจะแสดงเวอร์ชันของข้อมูลเมตาอีโมจิที่แอปใช้ หากไม่มีคีย์นี้ แอปจะไม่ใช้ EmojiCompat
หากมีคีย์และตั้งค่าเป็น true
แสดงว่าแอปเรียกใช้เมธอด SetReplaceAll()
แล้ว ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่า EmojiCompat
ได้ที่ส่วนตัวเลือกการกําหนดค่า
หลังจากได้รับคีย์ในแพ็กเกจ EditorInfo.extras
แล้ว แป้นพิมพ์จะใช้เมธอด hasEmojiGlyph()
ได้ โดยที่ metadataVersion
คือค่าสำหรับ EDITOR_INFO_METAVERSION_KEY
เพื่อตรวจสอบว่าแอปแสดงผลอีโมจิที่เฉพาะเจาะจงได้หรือไม่
การใช้ EmojiCompat กับวิดเจ็ตที่กำหนดเอง
คุณสามารถใช้เมธอด process()
เพื่อประมวลผล CharSequence
ในแอปก่อนแล้วเพิ่มลงในวิดเจ็ตที่แสดงผลอินสแตนซ์ Spanned
ได้ เช่น TextView
นอกจากนี้ EmojiCompat
ยังมีคลาสตัวช่วยวิดเจ็ตต่อไปนี้เพื่อให้คุณเพิ่มประสิทธิภาพวิดเจ็ตที่กำหนดเองด้วยการรองรับอีโมจิได้ง่ายๆ
- TextView ตัวอย่าง
- ตัวอย่าง EditText
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() { ... } }
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 ใช้หน่วยความจำเท่าใด
- ฉันใช้ EmojiCompat สำหรับ TextView ที่กําหนดเองได้ไหม
- จะเกิดอะไรขึ้นหากฉันเพิ่มวิดเจ็ตใน XML เลย์เอาต์ในอุปกรณ์ที่ใช้ Android 4.4 (API ระดับ 19) หรือต่ำกว่า
ระบบจะดาวน์โหลดแบบอักษรอีโมจิเมื่อมีการขอเป็นครั้งแรก หากไม่มีแบบอักษรดังกล่าวในอุปกรณ์ แอปจะทราบการตั้งเวลาการดาวน์โหลด
หลังจากดาวน์โหลดแบบอักษรแล้ว ระบบจะใช้เวลาประมาณ 150 มิลลิวินาทีในการเริ่มต้น EmojiCompat
ปัจจุบันโครงสร้างข้อมูลเพื่อค้นหาอีโมจิจะโหลดอยู่ในหน่วยความจำของแอปและใช้พื้นที่ประมาณ 200 KB
ได้ EmojiCompat มีคลาสตัวช่วยสำหรับวิดเจ็ตที่กำหนดเอง นอกจากนี้ คุณยังประมวลผลสตริงหนึ่งๆ ก่อนแล้วแปลงเป็น Spanned
ได้ด้วย ดูข้อมูลเพิ่มเติมเกี่ยวกับคลาสตัวช่วยวิดเจ็ตได้ที่ส่วนการใช้ EmojiCompat กับวิดเจ็ตที่กำหนดเอง
คุณสามารถรวมEmojiCompat
ไลบรารีการสนับสนุนหรือวิดเจ็ตของไลบรารีดังกล่าวไว้ในแอปพลิเคชันที่รองรับอุปกรณ์ที่ใช้ Android 4.4 (API ระดับ 19) หรือต่ำกว่า อย่างไรก็ตาม หากอุปกรณ์ใช้ Android เวอร์ชันก่อน API ระดับ 19 EmojiCompat
วิดเจ็ตจะอยู่ในสถานะ "ไม่มีการดำเนินการ" ซึ่งหมายความว่า EmojiTextView
จะทํางานเหมือนกับ TextView
ปกติทุกประการ
อินสแตนซ์ EmojiCompat
จะเข้าสู่สถานะ LOAD_STATE_SUCCEEDED
ทันทีที่คุณเรียกใช้เมธอด init()
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ EmojiCompat
ได้จากวิดีโอ EmojiCompat