ellipsize_end textview

不少時候,文本顯示是有限制的,有個maxline,而後要求你末尾截取,最後一行末尾是...(xxx文本...),那麼只要在你的xml裏設置 ellipsize_end 就好了,可是有時候每每需求就是千奇百怪,系統控件沒法知足產品的要求異步

好比下圖效果測試

這個textview在末尾要留必定的空白,由於末尾同行有個索引,這時候系統的end模式已經沒法實現,若是你在xml中把textview的ellipsize設置爲end,那麼末尾文字會直接到最右邊,跟後面的索引樣式重疊了xml

設想blog

而後你可能會聯想到一個經常使用的控件效果,摺疊TextView,文字過長,末尾會顯示所有,把多出文本收攏,而後在想,若是本身把所有設置成空格是否是就能夠達到這個效果呢,固然,能夠去看看大體源碼實現,是否可行,當時爲了偷懶,其實本人就是這麼想的,索引

一看代碼,感受可行,由於我看到了一個屬性 Layout,而Layout裏有個方法, getLineCount(),這個方法能夠獲取文本的行數,行數我都知道,那怎麼玩還不是本身說了算,因而就開搞了,一切很完美,效果nice,可是後面的...過短了,仍是會遮住索引,而後爲了偷懶,ip

就用一開始的設想,加空格解決了,反正都是不可見的,效果同樣,想要隔多少,那還不是本身說了算,因而就仿照摺疊textview的效果,把這個所有變成空格,這樣末尾不就是空白了,完美收工get

問題出現源碼

空格是加了,加上後一看效果,通常狀況很完美,可是有個特例,就是當文本差點到達 end 模式的要求時,就是假設你maxlie是2,可是標題文本就是差幾個字符纔會超出兩行,那麼此時,是觸發不了ellipsize效果的,由於getLineCount()返回的是2,不會進入end模式中去,而後本身腦洞大開,繼續延續以前的思路,空格大發,我留白的地方都是空格,那麼竟然文本差了幾個空格,我給它不上不久行了,反正末尾都是留白,不影響,因而空格加上,這時候真正的問題就來了string

死衚衕產品

凡是都有個可是,通過本身測試,通常狀況下,的確沒問題,不過若是你的文本末尾是空格,那麼end模式觸發不了,而後本身就覺得是文本空格沒計算進去,趕上打個斷點,可是發現的確文本末尾有不少空格,那時候還試了幾回,一直疊加空格,由於擔憂空格不夠沒觸發,後面加了一行空格了,仍是那樣,因而進入系統方法去查看,後面發現了問題所在,原來是getLineCount()方法仍是返回2,我文本長度明明已經超過了這個長度,但是getLineCount()確好像對末尾的空格不計算長度,因此致使這個狀況不起做用,而後就開始研究爲何getLineCount()返回2不是3,查了好多資料無論用,只要是空格就不會計算,而後本身還想過是否是後面直接加串文字,而後把那部分文字設置成透明顏色得了,越想越離譜了都

醒悟,換個思路

因而就是問了下羣裏的大佬,大佬說,我無論你getLineCount()是否是有什麼問題,首先你要實現什麼效果,而後我老實芭蕉的告訴他,我要這個,和那個,而後大佬說,本身本身測量一下有那麼難?真是一語點醒夢中人啊,有時候陷進去了就很難從那個模式中出來,後來決定拋棄前面的設想不用getLineCount()了,本身測量文字,那不是很簡單的事,爲何必定要如今那個getLineCount()上面,並且還有那麼多騷操做,而後本身直接自定義了個簡單的textview,直接重寫setText方法,測量,而後直接substring簡單,方便

上面還特地註釋了getLineCount()這個吭,而後一步步測量,獲得本身想要的信息,末尾由於要給索引留白,因此寫的-6,這裏能夠本身配置,這裏比較簡單就固定了,run一下

可是少年,你覺得這就完了?

此時你還會發現,測量是在初始化後,這個是異步的,刷新的時候你會發現會有閃爍,由於以前看過摺疊textview之類控件的作法,因此知道須要加個flag,初始化後就不須要再次監聽了

此時很完美,可是少年,你又覺得就完了?

此時又回到了上面提到過的問題,若是個人內容恰好差幾個字符知足條件呢,測量出來的line仍是2,不會進入end模式,可是此時已經不須要getLineCount()了,由於line是本身測量的,固然也不須要空格大發了,騷操做要不得,我這裏竟然能測量算出超出兩行,那麼我也能算出是否超出1.7行,1.5行,只要你感想,我就敢作

加個判斷,就算你差幾個字符,我照樣仍是能讓你進入end模式,你會發現這個時候很好擴展了,這本身的東西就是不同哈,在run一下,非常完美,你會發現標題已經變成了

 

 後面的留白能夠本身把控,最後看下效果圖

使用跟原生同樣,由於是重寫的setText

相關文章
相關標籤/搜索