Android中的 emoji
有關(guān)Android中emoji的文章有很多了,我就不簡單羅列相關(guān)內(nèi)容了,在這記錄一下開發(fā)過程中遇到的一些坑...
- 首先是TextView首次繪制中emoji的顏色會偏淺,官方的demo中依然存在這種問題...

上圖中可以看到其中兩個Textview的emoji顏色偏淺,但是EditView中就不會出現(xiàn)這個問題...
解決方法的話暫時有兩種,一是針對不能引入EmojiCompat的項目,可以考慮針對textview多次繪制,但是對此Textview設(shè)置background的時候會失效... 二是可以針對可以引入EmojiCompat的項目,但是簡單的直接設(shè)置EmojiCompat仍然不好用...通過自定義View即demo中的Custom TextView即刻解決這個問題
- 原生emoji的適配問題
不同版本的系統(tǒng)中適配的emoji是不同的,一般來說高版本兼容低版本的emoji.
另一個就是國產(chǎn)rom的問題,部分rom中會將android的emoji圖標替換成ios的emoji.會給人一種也沒什么差別的錯覺...但是,好歹都適配了啊,部分圖標還是android的emoji風格,就很迷
- emoji的大小問題
emoji的大小...是跟隨TextView的textSize,所以要想調(diào)整emoji的大小,需要更改textView的textSize值.
- EditText的刪除問題
鍵盤嘛,需要對editText進行操作,其中就包括了刪除的操作,然而,emoji有的占兩個字節(jié),有的占一個自己.所以再刪除的時候需要驗證內(nèi)容再刪除對應的字節(jié)
簡單來說,及時更新設(shè)備或者開發(fā)工具的話emoji展示并不是什么問題,愿望是美好的,現(xiàn)實卻總是不進如人意.(只有我覺得Android的果凍人emoji看著還可以么...)
Emoji鍵盤
先展示效果圖,

一個emoji鍵盤的主要功能都實現(xiàn)了,包括了emoji的輸入及刪除,多個emoji標簽頁之間的切換及底部滑動指示器的更改.需要展示底部標簽頁超過屏幕范圍的效果,所以展示的部分數(shù)據(jù)是重復的.
設(shè)計過程
最初的設(shè)計中是沒有底部多個emoji標簽頁的,感覺功能有點單薄,所以后期加入了底部過個item切換的功能
整個View設(shè)計如下,

- emoji展示與選擇區(qū)域: 主要是用于展示emoji的內(nèi)容,這里使用了ViewPager,在初始化的時候會對emoji展示列表進行計算,最終填充到ViewPager中.對于整個View來說,在初始化ViewPager的Adapter的時候就將所有的emoji填入,在滑動或者選擇底部item的時候會根據(jù)初始化中計算好的各個頁面的展示信息控制指示器及底部item.
- ViewPager的指示器: 實際上是一個LinearLayout,根據(jù)設(shè)置展示對應的數(shù)量及位置,此處展示的是當前item的相關(guān)指示器,當選擇新的item或者滑動到新的item后,指示器的數(shù)量會進行更新,而當上面的ViewPager滑動卻沒有切換到新的item的時候只是更新指示器指示的內(nèi)容.
- emoji標簽部分: 使用了一個RecycleView,是因為當標簽比較多時候滑動效果和定位展示比較方便.
設(shè)計缺陷
- 暫只支持emoji選擇,不能提供自定義圖片輸入(感覺更改完了就不只是emoji輸入器了,下個就做這個了)
- 底部指示器現(xiàn)在更新的過程中是全部移除view再根據(jù)新參數(shù)設(shè)置新view沒有動畫效果
- 底部emoji標簽頁再當選擇的item手動滑動超出屏幕顯示外后,再次滑動頂部ViewPager頁面,底部item復位動畫有點僵,仍有優(yōu)化的余地
代碼實現(xiàn)
- emoji展示與選擇區(qū)域:
主要是針對頂部ViewPager的Adapter處理

- EditText文本控制
再將EditText綁定到view中后,對view進行操作后會更改EditText的內(nèi)容

需要注意的是再刪除的時候是要先驗證后兩位是否是一個完整emoji,如果是則刪除后兩個字節(jié),反之則只刪除一個字節(jié).
- 底部標簽頁指示器
簡單的一個LinearLayout來展示指示器,沒有切換的動畫效果,可以優(yōu)化一波.

- 底部標簽選擇器
通過一個RecycleView來實現(xiàn)的底部標簽選擇器

- 監(jiān)聽ViewPager滑動及底部標簽選擇
添加ViewPager的addOnPageChangeListener方法來監(jiān)聽滑動及底部標簽選擇的點擊回調(diào)
