博客 / 詳情

返回

讓您的應用支持新式的 Emoji 符號吧!

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 政策,請參閲。

歡迎您 點擊這裏 向我們提交反饋,或分享您喜歡的內容、發現的問題。您的反饋對我們非常重要,感謝您的支持!

user avatar maenj_ba_lah 頭像 u_17584212 頭像 u_16099192 頭像
3 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.