- ScrollView中获取屏幕首行文字. 在这样一个ScrollView 中, ScrollView 对象mScrollView 有一个子对象ViewGroup mViewGroup(重置布局), mViewGroup 中又有0...n 个TextView 对象.
mScrollView ==> mViewGroup ==> TextView 对象
TextView 对象
TextView 对象 0...n
就是这样的场景了, 如何获取 mScrollView中显示在屏幕中, 并且非空的首行文字呢? 不知道有没有方法能直接取得屏幕当前显示的子对象呢? 反正我是不知道的, 那么只能用自己的土方法来实现了.
| textView | 可视区域顶, 滚动条Y 轴
| |
| textView |
| |
| |
| textView | 可视区域底
| |
- mScrollView 的滚动条的Y 轴是关键点!
- 整理下大概思路:
- 获取 mScrollView 的滚动条的Y 轴
- 再累计顺序TextView 子对象的高度, 直到这个高度超过 mScrollView 的滚动条的Y 轴
- 获取第二步最后操作的 TextView 的文本, 如果是空的, 继续第二步, 否则保留这个 TextView对象做进一步的处理
- 计算 Y 轴和累积TextView 子对象的高度差, 利用这个高度差, 就算出在TextView 对象中的字符偏移量. 在随笔10 中, 我最后写到了怎么获取TextView 选中文字, 道理是一样的, 靠的是字符偏移量.
- 当然有了偏移量我们的目的基本就可以达到了, 但是一些细节还是要处理.
如 我是lin49940, 我是lin49940, 我是lin49940, 我是lin49940, 可视屏幕顶
(字符偏移量) 我是lin49940,我是lin49940,我
我是lin49940, 我是lin49940, 我是lin49940,我是lin49940,
可能我们要取的那段字符串刚好为空, 那怎么办, 取后面的还是取前面的? 我的想法是后=>前, 先取后面的, 如果还是空, 再取前面的. 可能你会说, 前后都为空呢? 那你是没仔细看第三步骤, 只要你不搞出越界这样的异常, 大不了最终返回空字符串.
- 下面贴一些主要的方法
- 获取 mScrollView 的滚动条的Y 轴
- 再累计顺序TextView 子对象的高度, 直到这个高度超过 mScrollView 的滚动条的Y 轴
- 获取第二步最后操作的 TextView 的文本, 如果是空的, 继续第二步
- 计算 Y 轴和累积TextView 子对象的高度差, 利用这个高度差, 就算出在TextView 对象中的字符偏移量.android 的api 提供了好方法呢
还有另一个有趣的方法 int lineNum = _textView.getLayout().getLineForOffset(offset); 通过偏移量计算其所在的行数, 该行数也是从0 开始的. 这个方法有好处的, 我们可以通过行数, 控制滚动条的Y轴, 达到显示指定内容的效果.
- 到这里就算完成了, 取文字的操作不难, 只要注意不要是空字符串或者操作越界就行了! 在ScrollView 中, 上面和下面有半阴影的地方, TextView 可能有边框什么的, 这些都要根据自己的实际情况进行调整.
转眼早上6点了, 准备7点半去打球了.