Android 官方兼容庫 EmojiCompat Support Library

2021-02-13 Android編程精選

點擊上方「Android編程精選」,選擇「置頂公眾號」

關鍵時刻,第一時間送達!

    先不說楚楓的這般年紀,能夠踏入元武一重說明了什麼,最主要的是,楚楓在剛剛踏入核心地帶時,明明只是靈武七重,而在這兩個月不到的時間,連跳兩重修為,又跳過一個大境界,踏入了元武一重,這般進步速度,簡直堪稱變態啊。

    「這楚楓不簡單,原來是一位天才,若是讓他繼續成長下去,絕對能成為一號人物,不過可惜,他太狂妄了,竟與龔師兄定下生死約戰,一年時間,他再厲害也無法戰勝龔師兄。」有人認識到楚楓的潛力後,為楚楓感到惋惜。

    「哼,何須一年,此子今日就必敗,巫九與龔師兄關係甚好,早就看他不順眼了,如今他竟敢登上生死臺挑戰巫九,巫九豈會放過他?」但也有人認為,楚楓今日就已是在劫難逃。

    「何人挑戰老子?」就在這時,又是一聲爆喝響起,而後一道身影自人群之中掠出,最後穩穩的落在了比鬥臺上。

    這位身材瘦弱,身高平平,長得那叫一個猥瑣,金鉤鼻子蛤蟆眼,嘴巴一張牙帶色兒,說話臭氣能傳三十米,他若是當面對誰哈口氣,都能讓那人跪在地上狂嘔不止。

    不過別看這位長得不咋地,他在核心地帶可是鼎鼎有名,劍道盟創建者,青龍榜第九名,正是巫九是也。

    「你就是巫九?」楚楓眼前一亮,第一次發現,世間還有長得如此奇葩的人。

    巫九鼻孔一張,大嘴一咧,拍著那乾癟的肚子,得意洋洋的道:「老子就是巫九,你挑戰老子?」

    「不是挑戰你,是要宰了你。」楚楓冷聲笑道。

    「好,老子滿足你這個心願,長老,拿張生死狀來,老子今日在這裡了解了這小子。」巫九扯開嗓子,對著下方吼了一聲。

    如果他對內門長老這麼說話,也就算了,但是敢這麼跟核心長老說話的,他可真是算作膽肥的,就連許多核心弟子,都是倒吸了一口涼氣,心想這楚楓夠狂,想不到這巫九更狂。

    不過最讓人無言的就是,巫九話音落下不久,真有一位核心長老自人群走出,緩緩得來到了比鬥臺上,左手端著筆墨,右手拿著生死狀,來到了巫九的身前。

    「我去,這巫九什麼身份,竟能這般使喚核心長老?」有人吃驚不已,那長老修為不低,乃是元武七重,比巫九還要高兩個層次,但卻這般聽巫九的話,著實讓人吃驚不已。

    「這你就不知道了吧,巫九在前些時日,拜了鍾離長老為師尊,已正式得到鍾離長老的親傳。」有人解釋道。

    「鍾離長老?可是那位性情古怪的鐘離一護?」

    「沒錯,就是他。」

    「天哪,巫九竟然拜入了他的門下?」

    人們再次大吃一驚,那鍾離一護在青龍宗可是赫赫有名,若要是論其個人實力,在青龍宗內絕對能夠排入前三,連護宗六老單打獨鬥都不會是他的對手。

    只不過那鍾離一護,如同諸葛青雲一樣,也是一位客卿長老,所以在青龍宗內只是掛個頭銜,什麼事都不管,更別說傳授宗內弟子技藝了,如今巫九竟然能拜入他老人家門下,著實讓人羨慕不已。

    「恩怨生死臺,的確可以決鬥生死,但必須要有所恩怨,你們兩個人,可有恩怨?」那位長老開口詢問道。

作者:香辣牛肉麵連結:https://www.jianshu.com/p/2a26502db899

Android編程精選整理髮布,轉載請聯繫作者獲得授權

什麼是 emoji?

emoji 是一種 表情符號,來自日語詞彙「絵文字」(假名為「えもじ」,讀音即 emoji)

它的創造者是日本人慄田穰崇 ( Shigetaka Kurita ) ,他將目光投向兒時的各種元素以獲取靈感,如日本漫畫和日本漢字等。「日本漫畫中有許多不同的符號。漫畫家會畫出一些表情,表現一個人滿頭大汗或是迸發出一個想法時頭上出現一個燈泡。」同時,從日本漢字中他獲得了一種能力,用簡單的字符來表達「秘密」和「愛」等抽象概念。

早期的 emoji 表情並沒有一套統一的規範,日本的三大電信運營商,NTT DoCoMo,au/KDDI,Softbank 都各自有一套關於 Emoji 的編碼規範,導致運營商用戶之間發送 emoji 表情時無法顯示。

直到2010年10月,隨著 Unicode6.0 的發布,Emoji 的編碼以及對應的表情圖片正式被規範化,核心 Emoji 表情包含722個 Emoji 編碼。

之後 2014年6月15日發布的 Unicode 7.0 規範以及 2016年6月22日發布的 Unicode 9 規範都不斷地加入新的 emoji 表情,目前整個 emoji 表情已經達到了一千多個。

感興趣的同學可以到這裡查看所有表情對應的編碼

emoji 表情列表

Android 對 emoji 表情的兼容

很多同學可能並沒有注意到 Android 設備上的 Emoji 表情

一般情況下,我們在手機上進行操作時, 只有使用了輸入法自帶的表情及 emoji 表情才會在文本中產生 emoji 編碼。

在 Android 4.4 之前, Android 並不支持 emoji 表情,當時的解決方案主要是通過 imageSpan 配合 spannableString,來替換掉文字中的 emoji unicode 編碼符號。

從 Android 4.4 開始, 官方開始了 emoji 表情的支持,實現原理基本就是通過把 emoji 表情內置在系統的 ttf 字體庫中,對文本進行過濾後顯示出 emoji 表情。

由於不同 Android 版本內置的 ttf 字體庫對 emoji 表情的版本支持程度不同,導致老版本的 Android 對最新的 emoji 表情支持不全,所以一些 在新的 unicode 版本規範中被加入的 emoji 表情在老的 Android 設備上會顯示方框亂碼。

為了處理這個問題,除去上文提到的 spannable 的處理方案,我們還可以通過定義自己的 ttf 字體庫給文本空間指定字體來顯示 emoji 表情。

EmojiCompat Support Library 的誕生

正是由於上文提到的兼容問題,Google 官方的 EmojiCompat Support Library 誕生了。

目前這個庫能向下兼容到 Android 4.4,其主要目標就是為了讓我們的 Android 設備能夠支持最新的 emoji 表情,防止最新的 emoji 表情在我們的手機上顯示為☐。

EmojiCompat 通過 CharSequence 文本中的 emoji 對應的 unicode 編碼來識別 emoji 表情,將他們替換成 EmojiSpans ,最後再將 EmojiSpan 渲染成對應的 emoji 表情符號。

對於 EmojiCompat 的使用,有兩種配置方式:

Downloadable fonts configuration

Downloadable fonts 是 Android O 新增的一個功能,支持通過 google mobile service 遠程拉取需要的字體庫到本地來進行使用。

由於國內屏蔽了 Google Service ,所以這種方式在國內我們使用不了,這裡我們就不做詳細介紹了。

Bundled fonts configuration

Bundled fonts 即打包字體,就是使用本地打包好的 emoji 字體庫來兼容 emoji 表情。

目前官方使用的是 NotoColorEmojiCompat.ttf 字體文件。

EmojiCompat 的使用

接下來我們來看看如何使用 emojiCompat 庫

添加依賴庫

首先我們在 build.gradle 中配置我們的依賴包,由於我們使用的是 Bundled fonts 的配置,所以我們需要先引入我們的 emoji bundle 庫:

dependencies {    ...    compile "com.android.support:support-emoji-bundled:$version"}

這裡我 $version 設置的版本是 26.0.0-beta1,如果編譯過程中提示找不到依賴庫,需要在 repositories 倉庫配置中加入 Google 的 maven 地址:

allprojects {    repositories {        jcenter()        maven { url 'https://maven.google.com' }    }}

接著我們引入 EmojiCompat 的組件庫:

dependencies {    ...    compile "com.android.support:support-emoji:26.0.0-beta1"}

該組件庫對應的 emojiCompat 組件:

<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"/>

如果你使用的是 AppCompat 庫, 也可以直接添加 emojiCompat 的 compat 組件庫

dependencies {      compile "com.android.support:support-emoji-appcompat:26.0.0-beta1"}

該引用庫對應的組件:

<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"/>

compat 庫跟非 compat 庫之間的差別主要就是在使用的組件名稱上,其他的方式基本一致。

初始化 EmojiCompat

在正式使用 EmojiCompat 之前我們還需要對其進行初始化

public class MyApplication extends Application {@Override    public void onCreate() {       super.onCreate();       EmojiCompat.Config config = new BundledEmojiCompatConfig(this);       EmojiCompat.init(config);    }}

此時我們便可以使用上一步添加的 emojiCompat 組件來替換原有的 TextView、 EditText 以及 Button 組件了,當文本中遇到對應的 emoji 表情編碼時就會自動替換為 emoji 表情了。

[圖片上傳失敗…(image-4f8862-1535888727661)]

不通過組件使用 emojiCompat 兼容庫

EmojiCompat 庫通過 EmojiSpan 來渲染正確的表情圖片,因此需要先將文本 CharSequence 根據 emoji 編碼轉換成對應的 EmojiSpan Spanned 實例。

EmojiCompat 專門提供了一個 process() 方法用於CHarSequence 實例的轉換

使用這種方法,我們可以緩存處理過的實例而不是原始字符串,在需要使用的地方直接調用該實例,從而提高應用程式的性能。

TextView regularTextView = findViewById(R.id.regular_text_view);CharSequence processed = EmojiCompat.get().process("neutral face \uD83D\uDE10");regularTextView.setText(processed);

自定義 EmojiCompat 組件

除了上面提到的通過 EmojiCompat 的 process 方法轉換 spanned 實例外,我們還可以通過官方提供的兩個 widget helper 類來自定義我們的 TextView 以及 EditTextView 組件:

android.support.text.emoji.widget.EmojiTextViewHelper
android.support.text.emoji.widget.EmojiEditTextHelper

示例代碼:

自定義Emoji TextView

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() {       ...   }}

自定義 Emoji EditText

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 只兼容 Android 4.4 以上的設備,對於 4.4 以下的設備,它的行為跟普通的 Android 組件沒有差異。

EmojiCompat 的初始化時間大約只需要 150 毫秒,內存的佔用大概在200kb,所以你可以放心大膽地去使用它。

這裡是官方的 Demo 地址:
https://github.com/googlesamples/android-EmojiCompat

裡面包含了 downloadable fonts 的使用,因為比較完善 ,所以就不放我自己的 Demo 啦,感興趣的小夥伴趕緊去下載看看吧!

相關焦點

  • SpringBoot 增強庫 yue-library 2.1.0 發布,提供更多特性支持
    ├── yue-library 基礎庫│ ├── yue-library-dependencies 父pom│ ├── yue-library-base 基礎庫提供了豐富的Java工具包,同時也自動裝配了一系列基礎Bean等│ ├── yue-library-base-crypto 基於Hutool實現的加解密模塊,提供諸如數據脫敏此類的更多特性│ ├──
  • 2020 年 Q1 季度五大熱門的 Android 庫
    在 11 月和 12 月的版本後,我們是時候看看 2020 年初新發布的 Android 庫。這些庫引起很大反響。首先,我們有一個動畫底部工具欄庫,它不僅能讓你以編程的方式添加和刪除選項卡,而且可以通過 XML 添加和刪除選項卡。同時,這個庫還能讓我們輕鬆攔截 BottomBar 的選項卡切換。
  • 二維碼認識及Android快速接入(有源碼)
    本文章推薦使用庫android-zxingLibrary。地址:https://github.com/yipianfengye/android-zxingLibrary使用步驟:1.引用庫compile 'cn.yipianfengye.android:zxing-library:2.2'2.
  • android 垂直約束 - CSDN
    所以這篇文章基本上算是重寫了一遍,有任何不足請大家提出使用方式首先這個布局是要添加 依賴的,一般新建項目會默認添加這個依賴如果沒有也可以手動添加,截止完稿最新版本就是 1.0.2 版本,添加完依賴就能夠使用了compile 'com.android.support.constraint
  • Android實戰項目真槍實彈第二炮
    ><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"
  • 萬物皆可emoji
    點擊上方「青年文摘」右上角「...」點選「設為星標」點擊加星★ 貼近你心 ❤來源:城市畫報官方微信在傳遞加油打氣的正能量外,還不著聲色地提醒大家記得戴口罩,就是這個👇無獨有偶的是,前些天emoji官方也更新了,一加就加了117個。emoji每次更新,總有那麼幾個靈魂設計。而這次,我們等來了期盼許久的珍珠奶茶和「笑中帶淚」。
  • 詳解Android N 的新Emoji表情包
    站長之家(ChinaZ.com)4月18日消息,外媒EmojiPedia收集了Android N系統中的所有emoji表情,其中第一套emoji表情並無性別、年齡和膚色的分別,而是通過眼睛、嘴巴面部表情來傳達情感,相較此前凌亂的造型,Android N中採用了統一的形狀和黃色背景
  • android 進度條顯示時間專題及常見問題 - CSDN
    定義一個attrs.xml自定義CircleProgressViewpackage com.sample.circleprogressview.widget;import android.animation.ValueAnimator;import android.content.Context
  • android判斷edittext獲取焦點 - CSDN
    Activity完整代碼代碼裡寫了比較詳細的注釋,希望可以幫到大家package com.example.zhengzeyanzheng;import android.support.v7.app.AppCompatActivity
  • Google 開源的 Android 排版庫:FlexboxLayout
    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_width="match_parent"    android:layout_height="match_parent"    app
  • Android Spinner下拉框的基本使用
    ;java </item><item>php</item><item>xml</item><item>html</item></string-array>4、在布局文件xml的Spinner下添加:android
  • android 首次打開判斷專題及常見問題 - CSDN
    注意:模擬器是不會有這種權限彈窗的環境:appium 1.8android 7.0美團app權限彈窗1.以美團app為案例,安裝app首次啟動的時候,在引導頁出現權限彈出框,如下圖這種定位系統彈窗1.通過xpath來定位按鈕:始終允許loc = ("xpath", "//*[@text='始終允許']")2.用selenium裡面的顯示等待模塊(WebDriverWait)和判斷模塊(expected_conditions)封裝定位方法,之前selenium教程裡面詳細講過,這裡就不重複寫了from selenium.webdriver.support.ui
  • Android常用庫之遇見你真舒心
    網絡請求Android Async HTTP Android異步HTTP庫AndroidAsync 異步Socket,HTTP(客戶端+伺服器),WebSocket,和socket.io庫。基於NIO而不是線程。
  • 蘋果輸入法新增黑人emoji!還有117個全新表情包即將發布!
    #蘋果#在iOS 14中,又新增了一些表情符號,包括黑人握拳的表情……據外媒報導,蘋果在iOS13.6和iOS 14beta版輸入法中添加了象徵黑人人權的握拳emoji當輸入「黑人的命也是命」時,輸入法會自動顯示三個舉拳狀emoji。其他表情目前,距離iOS 14的發布大約有8周的時間,Apple將推出新功能,例如Android風格的小部件,App庫(代替應用抽屜),畫中畫,新的較小UI Siri等等。
  • 微信上線新的emoji,你真的懂emoji嗎?
    微信官方的回應也十分有趣:「今晚都會有的。」01emoji的魔力微信推出新的emoji,竟引起了如此大的轟動。真是小小的emoji,大大能量。emoji最早起源於日本,又被稱為「繪文字」(日語:絵文字/えもじ )。emoji之父慄田穣崇emoji的創始人是慄田穣崇先生。1999年,手機多半是黑白屏幕,而且屏幕很小,1個畫面只能表示48個文字。
  • 推特官方加入波場TRON與TRX emoji,認可波場王者公鏈地位!
    一、我為波場狂7月3日下午,波場TRON創始人孫宇晨發推表示,推特官方正式推出了波場TRON與TRX的專屬emoji表情,瞬時引起國內外的大規模的關注。假如你是Twitter的用戶,又恰好是波場代幣TRX持有者的人,之後就可以在Twitter裡使用波場TRON和TRX的emoji了!
  • Xbox官方詳解次世代向下兼容 《輻射4》能以60FPS運行
    Xbox官方博客今天公開了更多有關Xbox次世代主機向下兼容功能的詳情,一起來了解一下。根據官方介紹,Xbox Series X/S在實現向下兼容的同時,還引入了一項名為Auto HDR的功能,對於那些發售時還只有SDR的遊戲,此項功能會將HDR增強功能自動加入到遊戲中。官方也公布了一張Auto HDR功能的對比圖。
  • try the public library
    But then she and several others from the institute decided to create their own way to support community-based science education.