在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

現(xiàn)在Android平臺也能順利使用Emoji了

海闊天空的專欄 ? 來源:谷歌開發(fā)者 ? 作者:谷歌開發(fā)者 ? 2022-06-02 15:08 ? 次閱讀

在移動互聯(lián)網(wǎng)如此發(fā)達(dá)的今天,Emoji 已無處不在,并成為我們?nèi)粘=涣髦胁豢苫蛉钡囊徊糠帧?jù)統(tǒng)計(jì),Emoji 的使用率在過去 10 年內(nèi)不斷攀升,2021 年更是達(dá)到了歷史新高,每天有超過五分之一的推文中包含了 Emoji,一些應(yīng)用上的用戶每天發(fā)送的 Emoji 數(shù)量更是達(dá)到了數(shù)十億。然而用戶在 Android 平臺上使用 Emoji 時卻存在著一些問題,本文將針對這些問題進(jìn)行探討,并向您介紹 Emoji 的工作原理以及 Android 平臺近期關(guān)于 Emoji 的更新。

Emoji 在 Android 平臺的現(xiàn)狀

Emoji 在 Android 平臺存在的問題

Unicode 每年都會對 Emoji 標(biāo)準(zhǔn)進(jìn)行更新,用戶越來越頻繁地使用各種 Emoji,但卻存在有約 96% 的 Android 用戶無法正確查看新發(fā)布 Emoji 的問題,而 iOS 平臺只有 16%,這一比例明顯高出許多。

另外根據(jù)統(tǒng)計(jì)排名,前 100 位的 Emoji 占據(jù)了所有用戶日常使用 Emoji 總量的 82%,但在約 20% 的情況下,當(dāng)用戶發(fā)送一個 Emoji 后,對方看到的卻是豆腐塊或一張損壞的圖像,這種情況直接導(dǎo)致用戶無法正確通過 Emoji 來傳遞自己的本意。如下圖所示,用戶發(fā)送了一張含淚的笑臉,但對方卻只收到一個中間有 X 的方塊 (我們稱其為豆腐塊)。

圖片

△Emoji 在發(fā)送和接受方的不同顯示效果

隨著用戶的增多,Unicode 也在不斷增加新的 Emoji 來體現(xiàn)多元化和包容性,但是 Android 卻并不能完全兼容這些新版的 Emoji,不同的 Android 版本對 Emoji 的支持程度也不同。比如以下的幾個例子:

圖片

△Emoji 無法在不同 Android 版本間正確表達(dá)多樣性和包容性

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

Android 平臺針對 Emoji 的解決方案

以上問題顯然會導(dǎo)致非常糟糕的用戶體驗(yàn),并且不利于用戶之間通過 Emoji 進(jìn)行交流。我們的目標(biāo)就是確保所有 Android 用戶無論是使用哪種應(yīng)用,都能夠正常地使用每個 Emoji。為此,從 Android 12 開始,我們引入了可更新系統(tǒng)字體 (Updatable System Fonts),首先引入的便是 Emoji 字體,這也意味著開發(fā)者再也不需要在搭載 Android 12 以及 12 以上版本的設(shè)備中考慮 Emoji 適配的問題了,系統(tǒng)將默認(rèn)支持新的 Emoji。

但是考慮到時光機(jī)還沒有被發(fā)明出來,我們也沒辦法穿越到過去把可更新系統(tǒng)字體塞到舊版本的設(shè)備中去。如果一直等待時光機(jī)被發(fā)明出來而什么也不做的話,Android 12 版本之前的設(shè)備就會一直顯示豆腐塊,或者以其他錯誤的方式進(jìn)行渲染。因此我們還是做了些改進(jìn),讓您可以通過更新 Jetpack 庫

EmojiCompat

解決這一問題:

https://developer.android.google.cn/guide/topics/ui/look-and-feel/emoji-compat

EmojiCompat 早在幾年前就已經(jīng)發(fā)布,2021 年我們對其做了很多改進(jìn),并將其整合至AppCompat 1.4版本中。為此我們開發(fā)了一個新庫 androidx.emoji2,并添加了自動配置選項(xiàng),它可自行配置以加載正確的字體。我們將這個庫集成到了 AppCompat 1.4 中,也就是說,您僅需升級至 AppCompat 1.4 版本,便可在 API 19 及更高的版本上正常顯示新加入的 Emoji,開箱即用,無需任何額外配置。

  • AppCompat 1.4 版本
    https://developer.android.google.cn/jetpack/androidx/releases/appcompat#1.4.1
  • androidx.emoji2
    https://developer.android.google.cn/jetpack/androidx/releases/emoji2


AppCompat 1.4 針對 Emoji 的優(yōu)化

圖片

△Emoji2 和 Emoji 對比

Emoji2 庫是 AppCompat 庫的一個新的依賴項(xiàng),雖然它會代替現(xiàn)有的 androidx.emoji 庫,但是 API 幾乎相同。在此次更新中,我們使用 androidx.startup 添加了新的初始化程序 (EmojiCompatInitializer),添加了新的默認(rèn)配置,并且全部支持了 nullability 注解。另外,相較于 androidx.emoji,我們還刪除了一些在使用 AppCompat 時不再需要的 TextView 子類,這使得在 RA 之后節(jié)省了約 14KB 的大小。

  • Emoji2https://developer.android.google.cn/jetpack/androidx/releases/emoji2
  • androidx.emojihttps://developer.android.google.cn/jetpack/androidx/releases/emoji

圖片

△Emoji2 加載 Emoji 的步驟

在這次更改中,一大新特性便是 EmojiCompatInitializer,它是一個使用了 androidx.startup 庫的初始化程序,在應(yīng)用啟動時會自動配置 EmojiCompat。我們已對該初始化程序的性能進(jìn)行了大量的調(diào)整,對于大多數(shù)應(yīng)用來說使用默認(rèn)配置已經(jīng)完全足夠,但如果您需要對應(yīng)用啟動做納秒級別的優(yōu)化,則可以考慮移除 startup 庫和創(chuàng)建線程所帶來的消耗。首先,確保先初始化 EmojiCompat,再執(zhí)行 Activity.onCreate,這可以保證每個 TextView 都能顯示新版 Emoji。然后,可以像 EmojiCompatInitializer 一樣將 Emoji 字體加載延遲到首屏繪制之后,這樣做是因?yàn)殡m然加載過程是在后臺線程中進(jìn)行的,但它還是執(zhí)行大量的網(wǎng)絡(luò)和磁盤 I/O 操作,這些操作會同首屏加載一起搶奪資源。

這里再次強(qiáng)調(diào),我們已對該初始化程序的性能進(jìn)行了大量的調(diào)整和優(yōu)化,除非必要,請使用 EmojiCompatInitializer 的默認(rèn)實(shí)現(xiàn)。

pYYBAGKYYU6ARxuEAABPGqHk-_s700.png


另一個重要的功能是默認(rèn)配置,在 androidx.emoji 中您需要從文檔的示例代碼中復(fù)制一些模版配置 (類似于以上代碼) 到應(yīng)用中,而 Emoji2 中我們添加了可以直接用于 EmojiCompatInitializer 的 DefaultEmojiCompatConfig,如下代碼所示,只需一行簡單配置即可,當(dāng)然也支持手動配置的需求。

poYBAGKYYVOAFkV5AAAeVOGNZ3Q502.png

在 AppCompat 中,我們將 Emoji2 集成到了所有的視圖中,這意味著所有視圖都可以支持新版 Emoji,如果您的 Activity 繼承了 AppCompatActivity,在 XML 中直接使用 TextView 或 EditView 即可。AppCompatActivity 安裝了一個布局填充器 (LayoutInflater),它會用 AppCompatTextView 來替換 TextView 等視圖,在代碼中無論何時創(chuàng)建 TextView,都應(yīng)該確保創(chuàng)建的是 AppCompatTextView,并且自定義視圖應(yīng)該繼承相應(yīng)的 AppCompat 子類。
所有集成了 Emoji2 的視圖都有一個 EmojiCompatEnabled 屬性,通過它可以控制是否開啟 EmojiCompat,該屬性還提供了 getter 和 setter 方法。EmojiCompatEnabled 屬性有助于在知道文本絕不可能包含 Emoji 的情況下,來規(guī)避執(zhí)行 Emoji 的處理邏輯,雖然即使不規(guī)避該邏輯所帶來的成本也是極低的,但在某些情況下每一納秒都至關(guān)重要,此屬性便是為了支持這種情況。另外,該屬性對于在后臺線程上處理 Emoji 也很有幫助,AppCompat 對于 Emoji2 的集成會在 setText 之后的適當(dāng)時間調(diào)用 EmojiCompat.process,您可以通過 EmojiCompatEnabled 屬性禁用此方法調(diào)用,并對 Emoji 的處理移至后臺線程。但通常這種優(yōu)化沒必要,除非是在 RecyclerView 中展示大量的文本導(dǎo)致卡頓,那么可以考慮采用這一優(yōu)化方案。

測試新版 Emoji

由于集成了可下載字體,對于測試新版的 Emoji 并不是那么容易。要創(chuàng)建一個不會導(dǎo)致誤報或漏報的通用自動化測試庫很難,而大多數(shù)開發(fā)者在實(shí)際情況下會直接手動測試 EmojiCompat 的集成,因此最好的選擇還是使用一個記錄了用于測試的 Emoji 列表,同樣此方式對于手動測試或?qū)ζ聊唤貓D進(jìn)行測試也都非常有用。


如果您希望了解更多信息,請查看文檔:支持新式表情符號。我們在文檔中為您提供了一些關(guān)于配置測試模擬器和設(shè)備所需要的一些操作建議:

https://developer.android.google.cn/guide/topics/ui/look-and-feel/emoji2

Emoji 渲染原理


圖片

△一組碼點(diǎn)

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

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


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

圖片

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

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

圖片

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

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

圖片

△Emoji2 對 Emoji 字符的繪制過程

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


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

總結(jié)

本文通過分析 Emoji 在 Android 平臺存在的問題,針對不同版本的 Android 系統(tǒng)介紹了兩種解決方案:

  • Android 12 及以上的版本使用可更新系統(tǒng)字體,無需開發(fā)者手動適配;
  • Android 12 以下的版本集成 AppCompat 1.4 也可自動適配新版 Emoji,無需額外操作。

此外,我們還介紹了 Emoji 的渲染原理,讓您更進(jìn)一步了解 Emoji 是如何呈現(xiàn)在屏幕上的。請記得升級 AppCompat 到 1.4 版本,為用戶提供支持新版 Emoji 的最佳體驗(yàn)。

來源:谷歌開發(fā)者

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Andorid
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    7114
收藏 人收藏

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    ArkUI-X構(gòu)建Android平臺AAR及使用

    本教程主要講述如何利用ArkUI-X SDK完成Android AAR開發(fā),實(shí)現(xiàn)基于ArkTS的聲明式開發(fā)范式在android平臺顯示。包括: 1.跨平臺Library工程開發(fā)介紹 2
    的頭像 發(fā)表于 06-12 22:45 ?62次閱讀

    ArkUI-X在Android上使用Fragment開發(fā)指南

    本文介紹將ArkUI框架的UIAbility跨平臺部署至Android平臺Fragment的使用說明,實(shí)現(xiàn)Android原生Fragment和ArkUI跨
    發(fā)表于 06-12 22:42

    ArkUI-X與Android消息通信

    平臺橋接用于客戶端(ArkUI)和平臺Android或iOS)之間傳遞消息,即用于ArkUI與平臺雙向數(shù)據(jù)傳遞、ArkUI側(cè)調(diào)用平臺的方法
    發(fā)表于 06-08 22:15

    ArkUI-X跨平臺框架接入指南

    ArkUI跨平臺框架(ArkUI-X)進(jìn)一步將ArkUI開發(fā)框架擴(kuò)展到了多個OS平臺:目前支持OpenHarmony、Android、 iOS,后續(xù)會逐步增加更多平臺支持。開發(fā)者基于一
    發(fā)表于 05-18 18:21

    電氣助力毛里塔尼亞地面光伏項(xiàng)目順利并網(wǎng)

    2025年4月22日正值世界地球日,上電氣在全球可持續(xù)能源發(fā)展的征途上又邁出了堅(jiān)實(shí)的一步——上電氣精心打造的毛里塔尼亞地面光伏項(xiàng)目順利并網(wǎng),為該國提供一個高效、可靠的光伏逆變解決
    的頭像 發(fā)表于 04-23 16:59 ?284次閱讀

    電氣埃及Abydos儲項(xiàng)目順利發(fā)貨

    近日,上電氣為埃及Abydos儲項(xiàng)目提供的5MW集中式變流升壓一體機(jī)順利發(fā)貨,是上電氣攜手天合光能,助力埃及推進(jìn)綠色能源轉(zhuǎn)型,實(shí)現(xiàn)國際化戰(zhàn)略的一次重大突破。
    的頭像 發(fā)表于 01-22 09:53 ?387次閱讀

    電氣加速出海 順利供貨埃及首個公用事業(yè)級儲系統(tǒng)項(xiàng)目

    近日,上電氣為 埃及Abydos儲項(xiàng)目提供的5MW集中式變流升壓一體機(jī)順利發(fā)貨 ,是上電氣攜手天合光能,助力埃及推進(jìn)綠色能源轉(zhuǎn)型,實(shí)現(xiàn)國際化戰(zhàn)略的一次重大突破。 作為埃及首個應(yīng)用
    的頭像 發(fā)表于 01-22 09:33 ?1227次閱讀

    [迅為RK3568開發(fā)板]非科班能玩轉(zhuǎn)Android應(yīng)用,體驗(yàn)QT跨平臺能力

    [迅為RK3568開發(fā)板]非科班能玩轉(zhuǎn)Android應(yīng)用,體驗(yàn)QT跨平臺能力
    的頭像 發(fā)表于 12-18 16:41 ?841次閱讀
    [迅為RK3568開發(fā)板]非科班<b class='flag-5'>也</b>能玩轉(zhuǎn)<b class='flag-5'>Android</b>應(yīng)用,體驗(yàn)QT跨<b class='flag-5'>平臺</b>能力

    Android XR:耳機(jī)和眼鏡進(jìn)入 Gemini 時代

    “?Google?與三星和高通合作發(fā)布 Android XR,這是一個擴(kuò)展您的現(xiàn)實(shí)生活,以全新方式探索、連接和創(chuàng)造的平臺。?” 原文轉(zhuǎn)載自:https://blog.google/products
    的頭像 發(fā)表于 12-15 14:14 ?649次閱讀

    非科班能玩轉(zhuǎn)Android應(yīng)用,體驗(yàn)QT跨平臺能力-迅為RK3568開發(fā)板

    01-跨平臺的優(yōu)越性 Qt 是一個強(qiáng)大的跨平臺框架,允許開發(fā)者使用相同的代碼庫來構(gòu)建多個平臺上的應(yīng)用,包括 Windows、macOS、Linux 以及移動平臺
    發(fā)表于 12-10 14:33

    高通AI Hub:輕松實(shí)現(xiàn)Android圖像分類

    高通AI Hub為開發(fā)者提供一個強(qiáng)大的平臺,以優(yōu)化、驗(yàn)證和部署在Android設(shè)備上的機(jī)器學(xué)習(xí)模型。這篇文章將介紹如何使用高通AI Hub進(jìn)行圖像分類的程式碼開發(fā),并提供一個實(shí)際的例子來展示其在
    的頭像 發(fā)表于 11-26 01:03 ?784次閱讀
    高通AI Hub:輕松實(shí)現(xiàn)<b class='flag-5'>Android</b>圖像分類

    TLV320AIC3263有Android平臺的驅(qū)動代碼及寄存器配置表嗎?

    TLV320AIC3263這顆芯片有Android平臺的驅(qū)動代碼及寄存器配置表嗎?
    發(fā)表于 10-25 06:26

    合肥高校大學(xué)數(shù)字孿生可視化系統(tǒng)平臺建設(shè)項(xiàng)目順利通過驗(yàn)收

    合肥高校大學(xué)智能制造實(shí)驗(yàn)室近日迎來了一項(xiàng)重要時刻,數(shù)字孿生可視化系統(tǒng)平臺建設(shè)項(xiàng)目順利通過了驗(yàn)收。這一項(xiàng)目的成功實(shí)施,不僅標(biāo)志著合肥高校在智能制造領(lǐng)域取得新的突破,為我國智能制造技術(shù)的發(fā)展注入新活力
    的頭像 發(fā)表于 07-15 14:51 ?470次閱讀

    Android案例分享,基于瑞芯微RK3568國產(chǎn)平臺

    SDK:Rockchip_Android13_SDK_Release ? 硬件平臺介紹 創(chuàng)龍科技TL3568-EVM是一款基于瑞芯微RK3568J/RK3568B2處理器設(shè)計(jì)的四核ARM Cortex-A55國產(chǎn)工業(yè)評估板
    的頭像 發(fā)表于 06-20 10:04 ?1079次閱讀
    <b class='flag-5'>Android</b>案例分享,基于瑞芯微RK3568國產(chǎn)<b class='flag-5'>平臺</b>!

    Android案例分享,基于瑞芯微RK3568國產(chǎn)平臺

    開發(fā)環(huán)境說明Windows開發(fā)環(huán)境:Windows764bit、Windows1064bit虛擬機(jī):VMware15.5.5AndroidSDK編譯環(huán)境
    的頭像 發(fā)表于 06-20 08:05 ?1469次閱讀
    <b class='flag-5'>Android</b>案例分享,基于瑞芯微RK3568國產(chǎn)<b class='flag-5'>平臺</b>!
    主站蜘蛛池模板: 婷婷九月 | 五月综合久久 | 天天爱天天操 | 你懂的视频在线观看资源 | 国产成人综合日韩精品婷婷九月 | 永久免费精品影视网站 | 亚洲国产情侣偷自在线二页 | sis色中色| 欧美日韩免费大片 | 天天色综 | 日本最新免费网站 | 国产精品一区二区三区免费视频 | 午夜视频吧 | 中国国产aa一级毛片 | 美女扒开腿让男生桶爽网站 | 国模小丫大尺度啪啪人体 | 永久免费视频 | 亚洲图片欧美色图 | 1024手机在线看片 | 色天使色护士 在线视频观看 | 亚洲ol| ts人妖系列在线专区 | 免费看又爽又黄禁片视频1000 | 亚洲小视频在线播放 | 日本aaaaa毛片在线视频 | 久久婷人人澡人人爽 | 久久久精品免费热线观看 | 色老头永久免费网站 | 天天看爽片| 五月天婷婷网址 | 666精品国产精品亚洲 | 日本一区不卡在线观看 | 韩国理伦片在线观看2828 | 午夜视频在线网站 | 天天插天天 | 久久草在线免费 | 亚洲福利片 | 大乳妇女bd视频在线观看 | 色视频网站色视频播放 | 国产免费的野战视频 | 日韩三级在线观看视频 |