#什麼是 emoji? emoji 是一種 表情符號,來自日語詞彙「絵文字」(假名爲「えもじ」,讀音即 emoji)android
它的創造者是日本人慄田穰崇 ( Shigetaka Kurita ) ,他將目光投向兒時的各類元素以獲取靈感,如日本漫畫和日本漢字等。「日本漫畫中有許多不一樣的符號。漫畫家會畫出一些表情,表現一我的滿頭大汗或是迸發出一個想法時頭上出現一個燈泡。」同時,從日本漢字中他得到了一種能力,用簡單的字符來表達「祕密」和「愛」等抽象概念。git
早期的 emoji 表情並無一套統一的規範,日本的三大電信運營商,NTT DoCoMo,au/KDDI,Softbank 都各自有一套關於 Emoji 的編碼規範,致使運營商用戶之間發送 emoji 表情時沒法顯示。github
直到2010年10月,隨着 Unicode6.0 的發佈,Emoji 的編碼以及對應的表情圖片正式被規範化,核心 Emoji 表情包含722個 Emoji 編碼。緩存
以後 2014年6月15日發佈的 Unicode 7.0 規範以及 2016年6月22日發佈的 Unicode 9 規範都不斷地加入新的 emoji 表情,目前整個 emoji 表情已經達到了一千多個。bash
感興趣的同窗能夠到這裏查看全部表情對應的編碼app
emoji 表情列表maven
#Android 對 emoji 表情的兼容ide
不少同窗可能並無注意到 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 是 Android O 新增的一個功能,支持經過 google mobile service 遠程拉取須要的字體庫到本地來進行使用。
因爲國內屏蔽了 Google Service ,因此這種方式在國內咱們使用不了,這裏咱們就不作詳細介紹了。
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 表情了。
###不經過組件使用 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 地址: github.com/googlesampl…
裏面包含了 downloadable fonts 的使用,由於比較完善 ,因此就不放我本身的 Demo 啦,感興趣的小夥伴趕忙去下載看看吧!