为什么80%的码农都做不了架构师?>>>   

分页功能是阅读器类软件的基本功能之一, 也是自己之前写阅读器时遇到的第一个问题. 尝试了不少办法才解决, 现在把其中最容易实现的一个方法记录下来, 也方便大家参考.

基本思路如下:

  1. 从文件中读取 8000 个字符至缓冲区
  2. 将表示位置的指针指向缓冲区开头
  3. 让 TextView 显示从指针所指位置开始的内容
  4. 获取 TextView 中的可见字数 n
  5. 将指针向后移动 n 位
  6. 向后翻页时执行 3 ~ 5 步

整体思路很简单, 其中唯一的难点就是第 4 步, 如何获取 TextView 中的可见字数.

我遇到这类问题一般就是两步走, 先文档, 后源码.

所以先去查 Android 文档, 看看 TextView 有没有什么可以利用的函数. 在其中找到一个函数:

getLineBounds(int line, Rect bounds) // 得到指定行的边界

似乎有点用. 只要从第一行开始一行一行往下看, 直到找到超出边界的那一行, 就能知道这个 TextView 能显示多少行了. 或者用 getHeight() / getLineHeight() 也能获取 TextView 的最大显示行数. 但由于并不知道每行的字数, 所以还是算不出来一页到底有多少字.

后来又尝试了许多其他方法, 也在提问区问过. 结果只得到了一个建议, 就是自己写个 View. 整个 View 都由自己实现的话, 的确能很方便地控制所有细节, 但随之而来的麻烦就是, 所有的细节都得自己实现. 比如我的断行, 和布局自适应这两点处理得就没原生的 TextView 那么好, 只能说勉强能用. 更别提超链接这类的东西了, 要想全部实现还真不是一时半会能搞定的.

既然查文档无果, 那就只能去看源码了. 不看不知道, 这不起眼的 Textview 源码居然有近 9000 行, 顿时有点犯晕. 不过我的目标只有一个, 搞清楚 TextView 是怎么排版的. 所以直接看 onDraw(Canvas canvas) 函数, 在其中找到这么一行:

layout.draw(canvas, highlight, mHighlightPaint, cursorOffsetVertical);

由此可以推断 TextView 排版及绘制文字靠的就是这个 layout, 所以立刻到文档中找 Layout, 这次终于在其中找到了几个有用的函数(就是那些 getLine*** 函数), 最有用的是这两个:

getLineForVertical(int vertical) // 根据纵坐标得到对应的行号

getLineEnd(int line) // 返回指定行中最后一个字在整个字符串中的位置

所以我们只要先计算出最下面一行是第几行, 然后再算出这行最后一个字是第几个字就行了.

先算行号:

public int getLineNum() {Layout layout = getLayout();int topOfLastLine = getHeight() - getPaddingTop() - getPaddingBottom() - getLineHeight();return layout.getLineForVertical(topOfLastLine);
}

再算字数:

public int getCharNum() {return getLayout().getLineEnd(getLineNum());
}

这样我们就能得到 TextView 在本页所显示的字数了.

public class ReadView extends TextView {// 构造函数略...@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);resize();}/*** 去除当前页无法显示的字* @return 去掉的字数*/public int resize() {CharSequence oldContent = getText();CharSequence newContent = oldContent.subSequence(0, getCharNum());setText(newContent);return oldContent.length() - newContent.length();}/*** 获取当前页总字数*/public int getCharNum() {return getLayout().getLineEnd(getLineNum());}/*** 获取当前页总行数*/public int getLineNum() {Layout layout = getLayout();int topOfLastLine = getHeight() - getPaddingTop() - getPaddingBottom() - getLineHeight();return layout.getLineForVertical(topOfLastLine);}
}

示例工程下载: http://pan.baidu.com/share/link?shareid=3043803389&uk=1563550261

转载于:https://my.oschina.net/gotax/blog/136860

[Android] TextView 分页功能的实现相关推荐

  1. Android列表分页功能的实现,往下拉时刷新数据(显示正在加载中)

    1.需要在AndroidManifest.xml清单文件中获取InterNet权限 2.重写ListView控件(创建RefreshListView.java,继承自ListView) package ...

  2. android Textview 功能,Android:TextView的常用功能

    android:autoText如果设置,将自动执行输入值的拼写纠正.此处无效果,在显示输入法并输入的时候起作用 android:bufferType指定getText()方式取得的文本类别.选项ed ...

  3. android阅读器里的 txt 文本处理分页功能的实现:

     txt 文本处理分页功能的实现: 网上找了txt文本分页,实现小说阅读器的功能找了很久找不到自己想要的,所以自己实现一个专门处理txt文本分页功能的类.有人建议用randomAccessFile 可 ...

  4. android gridview分页显示,GridView使用自带分页功能时分页方式及样式PagerStyle

    GridView分页,使用自带分页功能,类似下面样式: 在aspx页面中,GridView上的PagerStyle下CssClass属性,设置为bubufxPagerCss,具体aspx页面代码: A ...

  5. android倒计时功能,android实现倒计时功能(开始、暂停、0秒结束)

    本文实例为大家分享了android实现倒计时功能的具体代码,供大家参考,具体内容如下 [思路]:通过 timer 执行周期延时的任务,handler 中将计时信息更新,并在计时结束时结束 timer ...

  6. Android TextView文本处理库推荐

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/115 Android TextView文本处理库推荐 现在 ...

  7. android实现箭头流程列表_反思|Android 列表分页组件Paging的设计与实现:系统概述...

    作者:却把清梅嗅 链接:https://github.com/qingmei2/blogs/issues/30 前言 本文将对Paging分页组件的设计和实现进行一个系统整体的概述,强烈建议 读者将本 ...

  8. 使用Kotlin的Android TextView –全面教程

    Kotlin is the official programming language for Android apps development. In this tutorial, we'll be ...

  9. Android 支持表情功能

    概述 1.原理和实现思路 2.表情图片显示 3.表情面板 4.表情的输入框插入和删除 5.表情添加脚本 Android中表情功能,一般都不是用ImageView去设置图片实现的, 表情一般会嵌套在文本 ...

最新文章

  1. 十二、springboot 详解RestControllerAdvice(ControllerAdvice)
  2. elment-ui文件上传详解
  3. 项目经理之项目经理的基本特征
  4. netty客户端源码
  5. Error in nextTick
  6. Excel还是那些事
  7. 西门子1200如何与c语言通信,S7-1200PLC1214c dc/dc/dc通过profinet以太网和S7-200smartcpu通讯怎么设置?...
  8. PHP地图规划骑行路径,骑行路线规划-路线规划-开发指南-iOS 导航SDK | 高德地图API...
  9. 写markdown用vscode的插件Markdown Preview Enhanced
  10. 【2021Java最新学习路线】java前端开发
  11. Java爬虫工程师技能列表
  12. 朴素贝叶斯+拉普拉斯平滑代码实现
  13. word怎么恢复默认样式
  14. vs2013(所有版本)-产品密钥
  15. 网页从输入url到呈现页面流程
  16. 大数据技术有哪些 应该重点学哪些知识
  17. Unity调用Window提示框Yes/No(英文提示窗)
  18. BeanDefinition 合并
  19. 数据库---战德臣第四章--关系代数笔记
  20. Ubuntu安装pidgin及QQ插件

热门文章

  1. Magento--判断checkout中是否使用了coupon code
  2. C/C++中善用大括号
  3. 开发中的问题——环境相关
  4. Java高级 —— 泛型
  5. macpro生成公钥并查看公钥
  6. 不懂这11个隐藏技巧,别说你会用微信
  7. Linux实时查看进程命令top笔记
  8. 各大高校女生节横幅来袭,个个都是段子手
  9. 十点总结,为何 Linux 如此深得人心
  10. 公司来了个傻员工,改变了所有聪明的员工