ScrollView 监听当前的高度改变
2013-07-25 11:12
288 查看
最近在使用ScrollView的时候遇到一些问题。查看API我们很容易发现使用ScrollView的scrollTo(x, y)很容易的使ScrollView定位到某个位置。
但是如果我在ScrollView中包含了一个TextView对象,我通过getScrollY()的方法取得了当前的高度,并保存了位置。后面就可以使用scrollTo(x, y)定位了。似乎一切都没有问题。但是,我如果允许用户设定TextView里面的文字大小的话,当TextView包含的内容很长的话,你原先保存的位置和能已经差的很远了。
这时我们似乎需要一个百分比的位置来解决这个问题。但Google似乎认为现有的方法已经够了,你们不可能有这么“复杂”的要求。无奈啊!
既然没有就自己想办法啦, 简单一看,发现ScrollView的对象有一个computeVerticalScrollRange() 方法, 当然这个方法是protected的,你是没有办法直接调用的。这就简单了,创建一个类继承ScrollView, 新建一个方法,把这个方法设置成public的,在里面调用computeVerticalScrollRange(), 一切问题都解决了。
?
code
这时,getTotalVerticalScrollRange()就可以计算出当前总的高度,再结合getScrollY(), 就可以计算出高度的百分比。改变文字大小的时候, 取到新的总高度,乘以百分比就可以定位到原先的位置了。
当然, xml里面就要这么调用了
?
code
附件是一个实例代码。里面还包含了一个ScrollView改变的时候的监听动作, 如果你要在用户拉多ScrollView作出额外动作的时候,可以参考。
创建一个Listener
?
code
但是如果我在ScrollView中包含了一个TextView对象,我通过getScrollY()的方法取得了当前的高度,并保存了位置。后面就可以使用scrollTo(x, y)定位了。似乎一切都没有问题。但是,我如果允许用户设定TextView里面的文字大小的话,当TextView包含的内容很长的话,你原先保存的位置和能已经差的很远了。
这时我们似乎需要一个百分比的位置来解决这个问题。但Google似乎认为现有的方法已经够了,你们不可能有这么“复杂”的要求。无奈啊!
既然没有就自己想办法啦, 简单一看,发现ScrollView的对象有一个computeVerticalScrollRange() 方法, 当然这个方法是protected的,你是没有办法直接调用的。这就简单了,创建一个类继承ScrollView, 新建一个方法,把这个方法设置成public的,在里面调用computeVerticalScrollRange(), 一切问题都解决了。
?
当然, xml里面就要这么调用了
?
创建一个Listener
?
相关文章推荐
- listview多个edittext的内容编辑时高度变化,而在ScrollView里,listview改变高度
- H5特性 MutationObserver 监听元素 动态改变iframe高度
- 禁止ScrollView内的控件高度改变之后自动滚动
- 计算并设置ListView的高度,防止嵌套ScrollView监听出现问题,(两种方法,一种自定义,一种测量)
- 通过ImageView的点击监听事件来滑动ScrollView的滚动条,进而改变屏幕显示内容
- 在android中键盘弹出和收起会改变window的高度,因此监听window的resize
- iOS中改变键盘的高度 监听键盘
- iOS 评论界面 监听键盘高度 动态改变输入框位置
- ora-12541: TNS:监听程序当前无法识别连接描述符中请求的服务
- iframe自适应当前页面高度
- textarea高度随内容自动改变
- CD——改变当前目录
- JS监听对象属性改变
- 监听键盘高度oc---swfit
- 改变 CListCtrl、CHeaderCtrl 高度、字体、颜色和背景
- jq监听input值改变时的事件
- 优雅的判断scrollView的滑动方向(只适用一次手势中不改变滑动方向)
- 获取系统当前音量 和 监听系统音量 ios
- ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务
- Android开发(三十)——ScrollView中ListView的高度自动适应