左右對齊的文字效果,很常見,在大多數文章上均可以看到,這種效果能給人帶來一種界面整潔的效果,可是若是隻是左對齊的話,頁面顯示就會良莠不齊;而app的頁面大多數都是圖形+文字的顯示效果,左右對齊的文字效果需求仍是很是大的;而反觀Android的官方控件TextView並無提供這種左右對齊的顯示效果,那麼就只能本身來造輪子了;git
這裏會涉及到實現原理的解析,若是隻是須要使用輪子,請拉到最底下;github
首先,讓咱們先來看一下TextView的顯示效果: 微信
原理:將一行剩餘的寬度平分給當前單詞的間距,這樣來達到左右對齊的效果; 那麼咱們就有兩種實現方案:
(1)TextView繪製一行的計算原理簡單粗暴,就是計算這一行顯示不下一個單詞的時候,就進行回車換行;TextView已經手動給咱們計算出了一行能顯示多少的字符,那麼咱們只須要經過計算剩餘的寬度再進行繪製便可;
會存在問題:若是一行存在單詞較少的狀況,就會出現間隔過大的問題; 好比: app
(2)經過手動計算一行能顯示多少個字符,而後再計算剩餘的寬度進行繪製; 這樣只是比第一步多了個本身計算一行能顯示多少個字符的操做;
可是這樣也會存在問題:若是單詞存在中英文混合,或者非中文的狀況,會很大機率出現換行時單詞被截斷的問題; 好比: cdn
以上兩種方案都會存在缺陷,那這樣的話咱們就得對出現的問題提出解決方案;
當前市場上有成熟的閱讀軟件,最經常使用的就是左右對齊的排版效果,來看看當前的閱讀軟件是怎麼解決這些問題的; 先看一下微信讀書app的顯示效果: blog
再看一下掌閱app的顯示效果: get
那麼最終方案就是: 經過手動計算一行能顯示多少個單詞,若是一行最後一個單詞顯示不下,則進行截斷處理,中文則不不存在該問題,這裏針對非中文的處理;而後再根據剩餘空間進行繪製; 那麼有了方案以後,接下來看看具體要怎麼實現;源碼
(1)先遍歷當前頁面的字符,將中英文截取爲一個個單詞,具體實如今getWordList(String text)方法裏面;經過遍歷當前的字符,判斷若是爲中文時,則爲一個單詞,非中文時則經過遍歷該英文單詞進行拼接,最後拼成一個非中文單詞;it
(2)經過遍歷當前的單詞,計算每一行要顯示的單詞集合,具體實如今getLineList(List frontList)這個方法裏面;遍歷單詞時,當添加最後一個單詞時,寬度已經超過一行顯示的距離,那麼就判斷最後一個單詞是否爲中文,是的話則添加到下一行,不然的話則進行截斷處理;io
(3)經過第二步計算出來的每一行的單詞,計算剩餘的距離進行繪製;
源碼實現請移步GitHub查看: github.com/Panxuqin/Al…