網(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
相關(guān)推薦
- 2022-02-11 idea package合在一起,利用Compact Middle Packages解決 &
- 2022-10-30 SwiftUI?List在MacOS中的性能優(yōu)化示例_Swift
- 2022-09-19 用正則表達(dá)式匹配字符串中漢字及中文標(biāo)點(diǎn)符號(hào)_正則表達(dá)式
- 2022-10-13 Android?8.0實(shí)現(xiàn)藍(lán)牙遙控器自動(dòng)配對(duì)_Android
- 2022-05-03 python實(shí)現(xiàn)跨進(jìn)程(跨py文件)通信示例_python
- 2022-04-17 spring cloud config和bus組件實(shí)現(xiàn)自動(dòng)刷新
- 2022-02-05 Numpy中不同維度數(shù)組之間的計(jì)算
- 2022-04-09 使用docker-compose一鍵部署開源博客wordpress
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支