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

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

安卓TextView的lineHeight*lineCount!=height問題,解決不支持滾動(dòng)的系統(tǒng)下對(duì)多頁Text進(jìn)行分頁

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

前言

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

這樣就導(dǎo)致了平時(shí)在普通安卓手機(jī)上很簡單的程序,在墨水屏系統(tǒng)上就很麻煩,比如多頁的應(yīng)用,普通安卓機(jī)直接搞一個(gè)ScrollView和RecyclerView就可以了,但墨水屏系統(tǒng)上你需要自己計(jì)算每頁展示多少內(nèi)容,然后在進(jìn)行分頁

舊方式分頁

由于墨水屏的特性,我們要實(shí)現(xiàn)一個(gè)跨頁的TextView,就需要進(jìn)行分頁處理

ps:為什么不適用自己繪制?因?yàn)橐嫒莞晃谋?/p>

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

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

ps:如果在低版本系統(tǒng)上發(fā)現(xiàn)lineHeight*lineCount始終和TextView的height查了固定數(shù)值的話,那可能是TextView的默認(rèn)邊距沒有去掉,去掉的代碼如下:

includeFontPadding = false

新方式分頁

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

通過扒拉TextView的源碼發(fā)現(xiàn),TextView計(jì)算Text和布局是通過Layout對(duì)象來實(shí)現(xiàn)的,于是我們就扒拉Layout的源碼

通過看源碼發(fā)現(xiàn)包含普通Text和普通富文本的TextView中的Layout對(duì)象是StaticLayout,然后發(fā)現(xiàn)StaticLayout將其中計(jì)算的行位置等的數(shù)據(jù)保存在了內(nèi)部變量mLines中,然后通過看源碼結(jié)合別的博客發(fā)現(xiàn)TextView的行位置計(jì)算方式有兩種:

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

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

?

七線的沒找到圖...

?而不管是哪種行位置的計(jì)算方式,其實(shí)我們并不用管太多,因?yàn)長ayout方法已經(jīng)給出了方法讓我們獲取相應(yīng)行的相應(yīng)位置了:

StaticLayout的getLineTop實(shí)現(xiàn):

?

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

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

結(jié)語

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

end

?

?

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

欄目分類
最近更新