Emoji 已無處不在,自發布以來 emoji 已成為我們語言中不可或缺的一部分,它生動有效的表達力帶來了語言文字層面的變革。您可能不會想到,連銀行應用、健身應用或外賣應用也都應該支援 emoji。Emoji 現在已經遍佈簡訊等通訊應用,已經成為我們語言的一部分。如果您的應用包含文字檢視,那麼它應該支援 emoji,至於原因,且聽我娓娓道來。?
遇到的問題 ?
如果您的應用沒有對 emoji 進行相應的處理,較早版本的 Android 可能不知道如何去顯示它們。在大多數情況下,只會顯示一個空白方格,我們稱之為 "豆腐"。在未正確處理 emoji 的應用中,在原本應該顯示 emoji 的位置將會顯示出一個 "豆腐塊",這可能會給使用者帶來困惑。例如,如果使用者在 TODO 應用的任務列表裡,向 EditText 中新增一個 ? 表情,此時使用者看到 "豆腐" 出現在螢幕上而沒有顯示輸入的 ? 表情時,使用者則會認為應用存在 bug。
為了使 emoji 更加有趣,在很多情況下,一個 emoji 是由其它多個 emoji 組成的。比如 ?? 是 ? 和 ? 的組合。
如果您輸入肌肉的表情,而應用顯示了胳膊和顏色方塊,那麼就不僅會讓使用者感到困惑,同時對於不同膚色風格的表述也有失準確,從而降低了應用的使用者體驗。
隨著語言的發展,emoji 也在不斷進化。每年新的 emoji 會以 Unicode 的形式新增到新的 Android 發行版本中,但可惜的是,沒有途徑能夠將新的 emoji 字型新增到 Android S 之前的版本。
解決方案
emoji2 庫已經整合到了 AppCompat 1.4,這意味著您只需升級至 AppCompat 1.4 版本,便可在 API 19 及更高版本上顯示流行的 emoji。AppCompat 中的所有 TextView 都預設支援,因為我們新增了自動配置,所以它可以配置自己來載入正確的 emoji 字型。如果需要,您可以在 XML 或者程式碼中為特定的 TextView 關閉該功能。
我們來看一下在 AppCompat 1.3 和 AppCompat 1.4 中 emoji 的顯示有什麼區別。
簡單來說,圖形化的 emoji 實際上只是顯示在文字中的一個圖片 ?️ 。它通過 Unicode 碼點來表示,如同字母 'e',但是 Unicode 規定: 當顯示碼點時,應顯示 emoji 圖片而非字母 'e'。這張圖片僅是字型檔案中的一個 png (更多內容請參閱我們 為 Android 打造的 emoji 字型)。通常您可能認為字型內容就是字母 'e' 的筆畫定義,但實際上字型的功能非常強大,可以包含 bitmap、png、svg,甚至完整的程式——有人在字型中實現了一個 遊戲 ?。
當以 Unicode 新增新的 emoji 時,新的 emoji 需要將新的 字形 或者可列印字元新增到 emoji 字型中——然後更新相應的表,字型就知道通過哪個碼點來顯示這個字形。
當輸入字串到平臺時,EmojiCompat.process 需要將它進行轉換,使其包含 EmojiSpan,它會告訴 Android 系統不要將該部分作為字串顯示,EmojiSpan 知道如何顯示 emoji。
EmojiCompat.process) 會遍歷字串並且找到所有的 emoji,併為每個 emoji 新增 EmojiSpan。EmojiSpan 會告訴 Android 不要以字串的形式顯示,而是呼叫 draw 方法來顯示。EmojiCompat.process 使用字典樹來查詢所有的子字串來匹配一個已知的 emoji。
字典樹是一種非常有趣的資料結構,它非常適合在字典中高效地查詢單詞 (或者 emoji)。EmojiCompat 會遍歷字串,針對字典樹檢查每個碼點。一旦它在字典樹中找到完整的 emoji,它會檢查是否平臺不清楚如何顯示 emoji 並且新增 EmojiSpan。您可以理解為 EmojiCompat 就是使用字典在字串中尋找 emoji,而對應字典內容的定義就是如何使用 EmojiSpan 來顯示所需的 emoji。
現在我們知道了 EmojiCompat 如何獲取 emoji,接下來我們聊聊如何顯示字串 "Hi"。
一個字串就是一組碼點,它們通過數字來表示字形,比如字母 'm' 或者數字 '1'。Emoji 同樣有對應的碼點——您可以在 Emojipedia 上找到它們,包括我們現在要顯示的 揮手 emoji。
最後,draw 函式會被呼叫,然後將字型檔案中的 emoji 直接畫出來,並且包含您想要的效果——您的字串!???
最後
Emoji 不僅僅只是有趣,它已經成為我們語言中不可或缺的一部分。如果您準備為使用者提供支援流行 emoji 的最佳體驗,請使用 AppCompat 1.4。
繼續前進,繼續使用 emoji 啦~ ? ?
更多關於 emoji 的最新 Play 政策,請參閱。
歡迎您 點選這裡 向我們提交反饋,或分享您喜歡的內容、發現的問題。您的反饋對我們非常重要,感謝您的支援!