網站首頁 編程語言 正文
前言
最近在做運行在墨水屏系統上的程序,由于墨水屏刷新率比較低,所以系統內的軟件是不允許滾動和加動畫的(在邏輯上)
這樣就導致了平時在普通安卓手機上很簡單的程序,在墨水屏系統上就很麻煩,比如多頁的應用,普通安卓機直接搞一個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
相關推薦
- 2022-07-22 idea 編譯項目后target包沒有resources文件
- 2022-09-23 windows10本地搭建FTP服務器圖文教程_FTP服務器
- 2021-11-13 Springboot/Springcloud項目集成redis進行存取的過程解析_Redis
- 2022-09-20 Go代碼檢查的推薦工具及使用詳解_Golang
- 2023-10-17 el-table-column 表單table的后端返回時間戳的轉換
- 2022-04-27 jQuery實現移動端懸浮拖動效果_jquery
- 2022-03-09 軟件構建工具makefile基礎講解_C 語言
- 2022-09-05 C語言之sizeof與strlen的使用及區別_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支