前言

最近在做运行在墨水屏系统上的程序,由于墨水屏刷新率比较低,所以系统内的软件是不允许滚动和加动画的(在逻辑上)

这样就导致了平时在普通安卓手机上很简单的程序,在墨水屏系统上就很麻烦,比如多页的应用,普通安卓机直接搞一个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

安卓TextView的lineHeight*lineCount!=height问题,解决不支持滚动的系统下对多页Text进行分页相关推荐

  1. 解决win10,64位系统下 PL2303 USB转串口驱动问题

    遇到问题: 在win10系统下: 在更新某个USB转串口驱动后,出现了黄色叹号,无法识别设备,遇到提示"该设备无法启动(代码10)": 或者下载安装USB转串口驱动后,每次插USB ...

  2. 解决Windows 与Mac 双系统下的蓝牙设备共用的问题

    不知道有多少人和我一样用的蓝牙鼠标或者键盘,有的话应该都会遇到同一个问题:即在一个系统下配好对后在另一个系统必须重新配对才能使用,很是麻烦.还要将蓝牙设备进入发现模式,OS下搜索,连接....终于昨天 ...

  3. (已解决)雷柏v500在Ubuntu系统下键位映射错误

    问题 想买个机械键盘码代码,没有留意就入手了这个便宜的机械键盘. 1. 手感还可以 2. ubuntu下ctrl和alt映射到了shift键位,很伤 解决 一共解决了两次才彻底解决了这个问题 可能大家 ...

  4. 解决win10和ubuntu双系统下win10时间偏差的问题

    在win10的基础上安装了ubuntu双系统,每次开机后,win10的时间都不对,需要手动调整,太麻烦了. 进入到ubuntu系统中,打开终端. 更新时间: sudo apt-get update s ...

  5. 双系统下卸载ubuntu 20.04再安装ubuntu 18.04的相关方法、软件以及出现ACPI Error错误和解决办法

    文章目录 前言 一.删除原来的ubuntu 20.04系统和开机引导 二.制作ubuntu18.04系统盘 三.安装ubuntu 18.04(已经有一个windows 10系统情况下) 四.安装完重启 ...

  6. 144显示器只有60_Win10系统下144hz显示器刷新率只显示60hz如何解决

    大家都知道,144hz显示器的显示效果比传统的会好很多,但是有win10系统用户购买44hz显示器之后,刷新率只显示60hz,这是怎么回事呢,其实我们手动设置一下就可以了,现在给大家讲解一下Win10 ...

  7. 网吧cf正在连接服务器,windows10系统下运行cf游戏提示连接服务器失败怎么解决...

    最近有windows10系统用户到本站反馈说碰到这样一个情况,就是在运行cf游戏的时候,提示连接服务器失败,导致无法运行cf游戏,该怎么解决这样的问题呢?现在就给大家讲解一下windows10系统下运 ...

  8. 安卓 TextView 七宗罪

    原文出自 http://blog.csdn.net/zhaizu/article/details/51038113,转载请注明. 安卓自带文本控件 TextView 有七个比较恶心人的地方: 默认情况 ...

  9. IE9不支持CSS line-height的文字垂直居中解决方法

    IE9不支持line-height原因:中文ie9不支持英文字体 相信大家在IE9看见自己使用line-height设置垂直居中文字不能垂直居中,这是与你设置字体有关,通常大家习惯设置font-fam ...

最新文章

  1. oracle sql删除job,修改Oracle的Job Scheduler 日志级别及删除运行日志
  2. 单例模式示例_单例设计模式示例
  3. linux使用root操作文件,以root用户登录Linux系统,当前目录是/root,要求完成如下操作和功...
  4. HTK语音识别基础教程.ppt
  5. 数据安全--安全网关
  6. php对接石基crs系统,IDeaS 收益管理系统与石基昆仑CRS 3.10成功对接
  7. P1894 [USACO4.2]完美的牛栏The Perfect Stall
  8. 将一个大文件分割为若干个小文件的方法
  9. 图像预处理(Evision)
  10. 历届试题 大臣的旅费 java
  11. Java架构师-容器化(一):服务容器化技术-Docker、Cloud Foundry
  12. 多智能体系统编队算法仿真--python3实现
  13. jQuery源码解析(架构与依赖模块)第一章 理解架构
  14. ruby-to_ary
  15. 完成输入框自动切换对应的中文或英文输入法
  16. 编程道路上的困难—怎么克服?
  17. 治理“假货之都”需要大数据打假
  18. 两台Exadata搭建RAC+DG
  19. 转行学习3D游戏建模多久能入行?
  20. 精心整理Webpack7分钟极速回忆录

热门文章

  1. 【Docker 教程】Docker 创建镜像
  2. [Hadoop编程实践]一个实用、清晰的MapReduce程序
  3. I3D视频分类论文梗概及代码解读Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset
  4. 大量兑换码的生成与验证方案(Java)
  5. 如何搭建一个移动端的网站?
  6. nginx 301永久定向
  7. Sentinel限流及其滑动窗口算法
  8. uniapp截图保存图片、点击按钮保存图片,可兼容app
  9. ubuntu16.04 系统分区与安装
  10. 用 JavaScript 五分钟将 Siri 接入 ChatGPT(含全部源码)