功能描述:彈出鍵盤,右邊有最大化按鈕,沒有最大化的時候最大行數爲3,默認1行,隨着文字輸入增長自動增長高度,到達3行時不會在增長,點擊最大化輸入框,行數無限制,輸入框下方圖片點擊刪除git
此處爲了簡便,鍵盤監聽用了一個庫,若是本身寫也簡單,直接 addOnGlobalLayoutListener 即可github
首先是點擊 edittext ,而後鍵盤自動彈起ide
這裏的鍵盤彈起是在dialog裏面提供了一個開關佈局
而後是xml,xml有點講究,否則達不到自動的效果,這也是實驗了多種方式佈局選擇的一種spa
圖中看出edittext輸入框包含了圖片瀏覽一塊兒,其實只是背景效果,二者是分開的,上部分是輸入框,下部分是一個列表,二者容器設置一個shape背景,這也看起來就跟一個總體同樣,圖片嵌入在了輸入框裏面,而後最下面是一個viewpager的表情列表3d
這種方式的佈局能夠達到一個效果,輸入文字增長輸入框會自動誇張行數高度,到了maxline後會中止,一開始想直接用約束的,不過試了幾種方法達不到最終的效果,由於最大化後約束也會影響着佈局,這樣要控制的話邏輯代碼就多了,因此爲了簡化這一步邏輯,裏面用的經常使用佈局方式,可是外層依然能夠約束起來,這樣一來最大化就只須要一小段代碼就能完美的切換了,我只須要控制輸入框的大小,其它佈局都會自動調整約束,這樣避免了不少邏輯控制操做xml
可是這裏須要一個高度,否則約束佈局起不到做用,除非所有使用經常使用佈局,可是嵌套太多,自從用了 ConstraintLayout 就有強迫症,多一層嵌套內心就不舒服,可是這裏也好處理,由於咱們須要監聽鍵盤的狀態,竟然都要監聽,那麼也就不算多出的邏輯blog
上圖爲切換表情輸入框狀態時的佈局顯示隱藏操做事件
而後咱們外層通常使用 setCanceledOnTouchOutside 讓dialog點擊自動消失,可是這裏還有一個要點,就是你操做想要手動讓dialog關閉的時候須要使用另外的dialog關閉方法去關閉,不然有的時候dialog中的鍵盤關閉不了,好比點擊發送,咱們須要圖片
關閉鍵盤和dialog
到這裏一個輸入框的雛形就有了
有了輸入框下面的表情就簡單許多了,這裏直接用一個recyclerview顯示,佈局均可以隨本身喜歡更換,把資源文件存入assets中,這裏是仿照雲信的作法,會自動讀取表情文件目錄,而後加載數據,並且配置也方便
最開始是顯示錶情,由於這裏用的是默認表情,須要必定的順序要求,因此用一個單獨的xml文件,固定位置,自定義參數讀取
這裏讀取資源是讀取的xml文件,用 DefaultHandler,調用該類的時候提供一個靜態加載,調用load方法
而後讀取節點,存入集合
而後就是簡單的讀取集合數據,加載recyclerview數據顯示默認表情,添加點擊事件,點擊後回調,把xml節點中的tag標籤設置到輸入框中,這裏須要一個方法去把tag轉換成表情顯示
這裏是在 addTextChangedListener 方法監聽去匹配的,不是在click事件裏
上面是大體的表情實現流程