前幾天因為業務需求,自己寫了個EllipsizeEndTextview ,剛好專案中也用到了另一個做法類似的 FoldTextView(文本折疊),而且老的庫中文本view顯示有bug,所以一次性到位,也參照上一個view重新寫一個,
告誡
不一定自己寫的就是好的,因為github能人輩出,牛人太多,而且很多庫使用廣泛,兼容性好,肯定踩了自己沒有踩過的吭,自己搗鼓的話就得把吭都踩一遍,還需要反復測驗,比較費時,索性這個FoldTextView不復雜,還有一個決定性的原因就是需求滿足,在很多時候通用的一些view沒法滿足自己的需求時這時候也不要強行去搞騷操作,不然也得不償失
重寫原因
因為自己的需求,有個套專門的文本匹配邏輯,需要替換文本顯示,所以有套專門的封裝,導致很多第三方庫無法共用,而且需要修改setText方法,所以也需要第三方的入口是重寫setText的,很多庫功能很齊全,但是跟本身業務兼容性不是很好,加上配置眾多,外加本來已經有個EllipsizeEndTextview了,所以延續這個大致思路,時間上也允許,短期內完成可行
設想
盡可能設計簡單,使用方便,兼容自己的業務,所以是直接在ellipsize_end textview基礎上做的,改動比較小,重寫setText方法,這個是必須的

可以看到,基本跟EllipsizeEndTextview 一樣的處理,但是因為本身的業務,會有空字符進入,所以需要對空字符額外處理一下
問題出現
進去看了EllipsizeEndTextview 應該知道還有一個額外處理,super.setText,此處延續之前的動態測量法,因為要處理EllipsizeEnd模式顯示文本,而且在末尾處還要額外多留空白,此時自帶的方法getCountLine是不行的,無法精確計算截取,所以肯定自己測量更靈活一點,但是問題出現了,如果文本中有\n等字符,測量就不準確了,明明已經換行了,但是測量結果寬度就是字符的實際寬度,而換行的寬度無法測量到,所以這時候沒辦法,只能用系統的 layout.getCountLine 方法了
新的方案
測量行不通,那么就果斷用 layout.getLineCount() 方法,這個方法看名字也知道,就是為了獲取行的,在這方面,它是專業的,而且不用跟EllipsizeEndTextview 一樣末尾留白,所以用它毫無影響,大致邏輯不用改,只需要把測量行的方法,替換成自帶的getLineCount就行了

這里折疊效果,所以折疊文本處需要定義顏色跟點擊事件 setSpan

這里只要跟原生textview一樣設定了文本后就會觸發折疊效果,方便擴展的業務需求

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/239535.html
標籤:其他
