日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

安卓TextView的lineHeight*lineCount!=height問題,解決不支持滾動的系統下對多頁Text進行分頁

作者:李小白lt 更新時間: 2022-07-19 編程語言

前言

最近在做運行在墨水屏系統上的程序,由于墨水屏刷新率比較低,所以系統內的軟件是不允許滾動和加動畫的(在邏輯上)

這樣就導致了平時在普通安卓手機上很簡單的程序,在墨水屏系統上就很麻煩,比如多頁的應用,普通安卓機直接搞一個ScrollView和RecyclerView就可以了,但墨水屏系統上你需要自己計算每頁展示多少內容,然后在進行分頁

舊方式分頁

由于墨水屏的特性,我們要實現一個跨頁的TextView,就需要進行分頁處理

ps:為什么不適用自己繪制?因為要兼容富文本

最開始使用的系統是基于安卓8的,其版本中TextView的行高lineHeight*行數lineCount=TextView的高度,所以最開始的TextView分頁算法也很簡單:

先用頁面高度/tv行高獲得一頁能展示多少行,然后通過tv總行數/單頁行數計算得到一共多少頁,最后在最底部畫一個矩形蓋住底部最后一行可能展示不全的text就可以了,偽代碼如下:

ps:如果在低版本系統上發現lineHeight*lineCount始終和TextView的height查了固定數值的話,那可能是TextView的默認邊距沒有去掉,去掉的代碼如下:

includeFontPadding = false

新方式分頁

后來用了新的安卓11系統后,發現lineHeight*lineCount!=height了,而且后續也上了很多種富文本,所以上面的方式就不太合適了,于是就需要找一種新的分頁方式了

通過扒拉TextView的源碼發現,TextView計算Text和布局是通過Layout對象來實現的,于是我們就扒拉Layout的源碼

通過看源碼發現包含普通Text和普通富文本的TextView中的Layout對象是StaticLayout,然后發現StaticLayout將其中計算的行位置等的數據保存在了內部變量mLines中,然后通過看源碼結合別的博客發現TextView的行位置計算方式有兩種:

分為5線和7線兩種(我的推測,如果有問題請大佬們指出)

其中5線的示意圖如下(圖片來自承香墨影大佬的博客,侵刪):?

?

七線的沒找到圖...

?而不管是哪種行位置的計算方式,其實我們并不用管太多,因為Layout方法已經給出了方法讓我們獲取相應行的相應位置了:

StaticLayout的getLineTop實現:

?

雖然沒有直接提供行最底部的y軸的值,但是提供了行最頂部的y軸獲取的方法getLineTop(line),所以我們只需要拿到下一行的lineTop并減1像素,那就是本行的底部的y軸了,這樣我們就可以計算TextView每行的高度并分頁了,偽代碼如下:

?最后再靈活繪制以下底部矩形蓋住顯示不全的文字就可以了

結語

安卓代碼量太大了,每個部分可能都很復雜,如果想搞清楚一個東西,那就直接去看其本質(源碼)

end

?

?

原文鏈接:https://blog.csdn.net/qq_33505109/article/details/125426843

欄目分類
最近更新