點擊上方「Android編程精選」,選擇「置頂公眾號」
關鍵時刻,第一時間送達!
先不說楚楓的這般年紀,能夠踏入元武一重說明了什麼,最主要的是,楚楓在剛剛踏入核心地帶時,明明只是靈武七重,而在這兩個月不到的時間,連跳兩重修為,又跳過一個大境界,踏入了元武一重,這般進步速度,簡直堪稱變態啊。
「這楚楓不簡單,原來是一位天才,若是讓他繼續成長下去,絕對能成為一號人物,不過可惜,他太狂妄了,竟與龔師兄定下生死約戰,一年時間,他再厲害也無法戰勝龔師兄。」有人認識到楚楓的潛力後,為楚楓感到惋惜。
「哼,何須一年,此子今日就必敗,巫九與龔師兄關係甚好,早就看他不順眼了,如今他竟敢登上生死臺挑戰巫九,巫九豈會放過他?」但也有人認為,楚楓今日就已是在劫難逃。
「何人挑戰老子?」就在這時,又是一聲爆喝響起,而後一道身影自人群之中掠出,最後穩穩的落在了比鬥臺上。
這位身材瘦弱,身高平平,長得那叫一個猥瑣,金鉤鼻子蛤蟆眼,嘴巴一張牙帶色兒,說話臭氣能傳三十米,他若是當面對誰哈口氣,都能讓那人跪在地上狂嘔不止。
不過別看這位長得不咋地,他在核心地帶可是鼎鼎有名,劍道盟創建者,青龍榜第九名,正是巫九是也。
「你就是巫九?」楚楓眼前一亮,第一次發現,世間還有長得如此奇葩的人。
巫九鼻孔一張,大嘴一咧,拍著那乾癟的肚子,得意洋洋的道:「老子就是巫九,你挑戰老子?」
「不是挑戰你,是要宰了你。」楚楓冷聲笑道。
「好,老子滿足你這個心願,長老,拿張生死狀來,老子今日在這裡了解了這小子。」巫九扯開嗓子,對著下方吼了一聲。
如果他對內門長老這麼說話,也就算了,但是敢這麼跟核心長老說話的,他可真是算作膽肥的,就連許多核心弟子,都是倒吸了一口涼氣,心想這楚楓夠狂,想不到這巫九更狂。
不過最讓人無言的就是,巫九話音落下不久,真有一位核心長老自人群走出,緩緩得來到了比鬥臺上,左手端著筆墨,右手拿著生死狀,來到了巫九的身前。
「我去,這巫九什麼身份,竟能這般使喚核心長老?」有人吃驚不已,那長老修為不低,乃是元武七重,比巫九還要高兩個層次,但卻這般聽巫九的話,著實讓人吃驚不已。
「這你就不知道了吧,巫九在前些時日,拜了鍾離長老為師尊,已正式得到鍾離長老的親傳。」有人解釋道。
「鍾離長老?可是那位性情古怪的鐘離一護?」
「沒錯,就是他。」
「天哪,巫九竟然拜入了他的門下?」
人們再次大吃一驚,那鍾離一護在青龍宗可是赫赫有名,若要是論其個人實力,在青龍宗內絕對能夠排入前三,連護宗六老單打獨鬥都不會是他的對手。
只不過那鍾離一護,如同諸葛青雲一樣,也是一位客卿長老,所以在青龍宗內只是掛個頭銜,什麼事都不管,更別說傳授宗內弟子技藝了,如今巫九竟然能拜入他老人家門下,著實讓人羨慕不已。
「恩怨生死臺,的確可以決鬥生死,但必須要有所恩怨,你們兩個人,可有恩怨?」那位長老開口詢問道。
作者:香辣牛肉麵連結:https://www.jianshu.com/p/2a26502db899Android編程精選整理髮布,轉載請聯繫作者獲得授權
什麼是 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 configurationDownloadable fonts 是 Android O 新增的一個功能,支持通過 google mobile service 遠程拉取需要的字體庫到本地來進行使用。
由於國內屏蔽了 Google Service ,所以這種方式在國內我們使用不了,這裡我們就不做詳細介紹了。
Bundled fonts configurationBundled 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 啦,感興趣的小夥伴趕緊去下載看看吧!