Emoji表情在Android平臺的應(yīng)用

每一個(gè) emoji漠魏,就是一個(gè) Unicode 字符倔矾。全世界的 emoji 都由統(tǒng)一碼聯(lián)盟(The Unicode Consortium)來投票選拔和公布,世界各地的人們可以向聯(lián)盟提交 emoji 提案蛉幸。而統(tǒng)一碼聯(lián)盟的 emoji 規(guī)范破讨,只是定義了某個(gè)字符的語義,再由 Emojipedia 這個(gè)網(wǎng)站對 emoji 進(jìn)行描述表達(dá)奕纫,最后允許大家按照對描述的理解,自由地去設(shè)計(jì)圖案烫沙。

目前 iOS 15.4 和 Android 12L 所使用的最新版 Emoji 的正式名稱其實(shí)叫 Emoji 14.0匹层,它是在 2021 年 9 月通過了 Unicode(統(tǒng)一碼)聯(lián)盟的批準(zhǔn)發(fā)布,然后才被 Google 和蘋果應(yīng)用在系統(tǒng)中锌蓄。

??
Emoji名稱:嘿嘿
英文名稱:grinning face
unicode版本: 6.1
unicode編碼:U+1F600

一個(gè) emoji 的版權(quán)細(xì)節(jié)可能設(shè)計(jì)多方的利益:

emoji 的官方名字版權(quán)屬于 Unicode 規(guī)范升筏,即統(tǒng)一碼聯(lián)盟;
emoji 的描述文字版權(quán)瘸爽,屬于網(wǎng)站 emojipedia.org您访;
emoji 對應(yīng)的圖形設(shè)計(jì)版權(quán),屬于它的創(chuàng)作者或公司剪决。

相同emoji編碼在不同平臺上的圖像

Android不同系統(tǒng)版本之間emoji互通問題

Emoji 在發(fā)送和接受方的不同顯示效果
Emoji 無法在不同 Android 版本間正確表達(dá)多樣性和包容性

在 Android 7.0 Nougat 和更早版本上無法正確通過 Emoji 表示膚色灵汪。用戶發(fā)送了一個(gè)表示深膚色手臂的 Emoji檀训,但對方收到的卻是一個(gè)手臂和深色方塊的分解版本。
在 Android 8.0 Oreo 和更早版本上無法正確顯示代表中性的 Emoji享言。
在 Android 9 Pie 和更早版本上不支持顯示多人多膚色的 Emoji峻凫。

emoji 編碼規(guī)則

emoji modifier sequence (修飾序列)

????是一個(gè)Emoji修飾符序列,它由兩個(gè)Emoji組合而成览露,分別是:??(Emoji修飾符基礎(chǔ))和??(Emoji修飾符)荧琼。膚色Emoji修飾符共有5種,分別是:??, ??, ??, ??, ??差牛。??可以與這些膚色Emoji修飾符結(jié)合形成新的Emoji序列命锄,下面是組合的例子:

??(\ud83e\uddd1)????(\ud83e\uddd1\uD83C\uDFFE)

emoji zwj sequence (零寬連接序列, zwj=zero width joint)

????????(1F468 200D 1F469 200D 1F467 200D 1F467)是一個(gè)零寬連接符Emoji序列,它由3個(gè)ZWJ零寬度連接符和4個(gè)單獨(dú)Emoji組合在一起形成偏化。這些單獨(dú)的Emoji分別是:?? (男人), ?? (女人), ?? (女孩), ?? (女孩)累舷。組成的新Emoji在一些兼容性好的平臺中顯示為一個(gè)單獨(dú)的Emoji:????????,但在一些兼容性不好的平臺也可能顯示為多個(gè)放在一起的Emoji:????????

Emoji 渲染原理

一組碼點(diǎn)

Emoji 屬于一種圖形字符夹孔,是字符串的一部分被盈。它就像字母 "I" 一樣,只是繪制方式和從屬的字體文件不同而已搭伤。但是對于計(jì)算機(jī)來說只怎,它并不會特意關(guān)心什么是 Emoji 或字母 "I",一個(gè)字符串本質(zhì)上就只是一組碼點(diǎn)怜俐,其中的數(shù)字通過 Unicode 進(jìn)行分配身堡,代表著計(jì)算機(jī)上會出現(xiàn)的每一個(gè)字符。

現(xiàn)在 Unicode 并不僅僅只是一種格式了拍鲤,它還代表了制定該標(biāo)準(zhǔn)的委員會贴谎,委員會會決定一些事情,比如數(shù)字 7 代表字母 "I" (實(shí)際上 7 并非真正代表字母 I 的碼點(diǎn)季稳,此處僅僅是舉個(gè)例子)擅这。那么當(dāng)您試圖在 Android 上渲染上述表示字符串的碼點(diǎn)時(shí)會發(fā)生什么呢?

首先景鼠,Android 會根據(jù)碼點(diǎn)和應(yīng)用要求使用的字體樣式為每個(gè)字符找出最佳字體仲翎。當(dāng)前 Android 上非斜體且正常粗細(xì) "V" 的默認(rèn)字體是 roboto-regular.ttf,Android 會對字符串進(jìn)行遍歷铛漓,檢查每個(gè)字符并查找最佳字體溯香。它會檢查碼點(diǎn)和樣式,您可以對字符串進(jìn)行樣式的定制操作浓恶,比如對一些字符進(jìn)行加粗等等玫坛。對于上述簡單的字符串來說,它就只是會選擇 roboto-regular.ttf 字體包晰。

遍歷碼點(diǎn)查找正確的字符串

但是湿镀,當(dāng)遇到 Emoji 字符時(shí)炕吸,您可能會覺得它會進(jìn)行完全不同的渲染方式,畢竟它看起來不像任何其他的字母肠骆。但實(shí)際上算途,Emoji 就是個(gè)文本,由碼點(diǎn)表示蚀腿,同字母 "I" 和 "I" 一樣沒什么區(qū)別嘴瓤,繪制它的方式就存儲到了字體中。Android 會首先嘗試在字體中查找無斜體且正常粗細(xì)的 "融化臉"莉钙,但這一次發(fā)現(xiàn)在 roboto-regular 中并沒有想要的結(jié)果廓脆,便會去 NotoColorEmoji 中進(jìn)行查找,這是 AOSP 上預(yù)裝的 Emoji 字體磁玉,它包含了每個(gè) Emoji 的圖像停忿,在 Android 平臺上通過這種字體繪制 Emoji 和繪制字母 "I" 的方式完全相同,都是查找字體文件后在屏幕上繪制出來蚊伞。

通過 NotoColorEmoji 對 Emoji 字符進(jìn)行繪制

在 Android 12 及以上版本中席赂,平臺可以確保 Emoji 會正常顯示,因?yàn)榭筛孪到y(tǒng)字體會將新版 Emoji 添加到字體文件中时迫。但對于 Android 12 之前的版本颅停,我們沒有任何方法可以更新字體,這意味著 Android 不知道用什么字體來繪制 "融化臉"掠拳,此時(shí)它會改為繪制一個(gè)稱為豆腐塊的備用字形癞揉。這里就是 Emoji2 開始大展身手的地方了。

Emoji2 對 Emoji 字符的繪制過程

在將字符串發(fā)送到 Android 系統(tǒng)之前溺欧,在字符串上會調(diào)用 EmojiCompat.process 方法喊熟,此調(diào)用將遍歷并查找那些系統(tǒng)不知道如何繪制的 Emoji,并為每個(gè) Emoji 添加一個(gè) EmojiSpan姐刁,這是一個(gè)替換 Span芥牌,這意味著它將只替換該段字符串中對應(yīng)的內(nèi)容。系統(tǒng)會直接使用 roboto-regular.ttf 正常繪制龙填,但當(dāng)找到 EmojiSpan 時(shí)它會將繪制權(quán)轉(zhuǎn)交給 Span胳泉。

在該 Span 中 Android 使用了兩個(gè)方法,首先岩遗,它會獲取字符尺寸并告訴 Android 要在文本布局中為此 Span 保留多少空間,然后凤瘦,當(dāng)需要繪制字符串時(shí)宿礁,它將調(diào)用 EmojiSpan 上的 draw 而非自行繪制。在 EmojiSpan 中蔬芥,它知道 Compat 版的 Emoji 字體位置梆靖,并能直接從中繪制出 "融化臉"控汉。再返回到渲染階段,平臺將調(diào)用 EmojiSpan.draw返吻,整個(gè)區(qū)域?qū)⒂?EmojiSpan 進(jìn)行繪制姑子,而非平臺。實(shí)際上测僵,從平臺的角度來看 EmojiSpan 只是在字符串中間繪制了一張圖片街佑,并沒有別的特殊操作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捍靠,一起剝皮案震驚了整個(gè)濱河市沐旨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榨婆,老刑警劉巖磁携,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異良风,居然都是意外死亡谊迄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門烟央,熙熙樓的掌柜王于貴愁眉苦臉地迎上來统诺,“玉大人,你說我怎么就攤上這事吊档「菀椋” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵怠硼,是天一觀的道長鬼贱。 經(jīng)常有香客問我,道長香璃,這世上最難降的妖魔是什么这难? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮葡秒,結(jié)果婚禮上姻乓,老公的妹妹穿的比我還像新娘。我一直安慰自己眯牧,他們只是感情好蹋岩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著学少,像睡著了一般剪个。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上版确,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天扣囊,我揣著相機(jī)與錄音乎折,去河邊找鬼。 笑死侵歇,一個(gè)胖子當(dāng)著我的面吹牛骂澄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惕虑,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼坟冲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了枷遂?” 一聲冷哼從身側(cè)響起樱衷,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酒唉,沒想到半個(gè)月后矩桂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痪伦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年侄榴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片网沾。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡癞蚕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辉哥,到底是詐尸還是另有隱情桦山,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布醋旦,位于F島的核電站恒水,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饲齐。R本人自食惡果不足惜钉凌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捂人。 院中可真熱鬧御雕,春花似錦、人聲如沸滥搭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瑟匆。三九已至福青,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脓诡,已是汗流浹背无午。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祝谚,地道東北人宪迟。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像交惯,于是被迫代替她去往敵國和親次泽。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 前言 很久沒有重裝系統(tǒng)了席爽,感覺技藝都生疏了意荤,趁著最近在 DIY 裝機(jī)[https://diy.jd.com] 就順...
    anyesu閱讀 2,680評論 0 0
  • 引言 在人類中,特別是在免疫功能受損的患者及糖尿病患者中只锻,毛霉菌病表現(xiàn)為多種不同的綜合征[1[https://ww...
    小曾姑娘閱讀 1,510評論 0 2
  • 目錄[https://www.cnblogs.com/baiqiantao/p/15695378.html#%E7...
    夢想指引著我閱讀 1,690評論 0 1
  • Python 語法 說說你平時(shí) Python 都用哪些庫 == 和 is 區(qū)別玖像。== 是比較兩對象的值,is 是比...
    宇宙之一粟閱讀 599評論 0 2
  • 概述 ??希爾伯特空間是一個(gè)完備的內(nèi)積空間齐饮,其標(biāo)準(zhǔn)正交函數(shù)系捐寥,直觀來看就是向量空間中基的延伸。其為基于任意正交系上...
    殉道者之花火閱讀 1,717評論 1 5