Android 中实现 ScrollView 的滚动事件监听
来源:互联网 发布:矢量图下载 知乎 编辑:程序博客网 时间:2024/04/27 16:48
转自:http://www.rincliu.com/blog/2013/11/16/scrollview/
最近在自己实现一个类似 Pinterest 瀑布流展示效果的组件,GitHub 上其实有类似项目,比如 PinterestLikeAdapterView、PinterestListView , 但都或多或少有些不足(详见这篇文章的分析),然后自己想基于 ScrollView
去嵌套多列LinearLayout
实现。
坑爹的是系统自带的 ScrollView
功能相当粗糙:连个最基本的 setOnScrollListener()
的方法都没有,仅有个onScrollChanged()
方法,而且还是 protected
的。不得不吐槽下,Google 真够懒的,这货纯粹就是个毛胚啊,完全得靠开发者去继承后自己打磨。
首先当然是继承 ScrollView
,然后把最原始的 onScrollChanged()
方法暴露给外部:
然后需要两个判断位置的方法(top or bottom),比如要实现一个滚动到底部自动加载更多数据的功能,这个就是必须的:
顶部好说了,就是 Y 方向滚动为 0 。底部判断:Y 方向滚动等于最后一个 child 元素底部相对 parent 的位置减去 parent 高度,然后还要考虑到 parent 自身可能有 paddingBottom
。
然后像瀑布流这种几乎没有底的东西,得需要个判断 child 是否处于屏幕可见范围内的方法,不然将所有 item 的 View
和 Bitmap
都放在内存肯定是相当占用资源的,既影响滑动流畅性,又很容易 OOM 。
这里用到了 View
的 getLocalVisibleRect()
方法,官方文档没有给出任何相关说明。
不过看方法名应该不难了解其功能:获取可见的矩形,参数也是个矩形,这里传过去的是 parent 边界所在的矩形,返回值 boolean
类型。也很好理解:不可见的 child 当然得不到可见的矩形了。
顺便提一下,StackOverflow 上有对这个神秘方法的讨论,提到了一个 getLocalVisibleRect()
方法,这里就不深挖了。
回到这个用于实现瀑布流的加强版 ScrollView 上来,为了实现滚动到底部自动加载还有顶部下拉刷新这些功能,肯定还需要监听滚动是否停止。
首先想到的是 onScrollChanged()
方法,在这个里面去判断 Y
和 oldY
是否相等,发现效果不是很理想。
然后就想到自己去后台实时检测这个 scrollY
的变化,详细思路如下:
首先设置
onTouchListener
,去监听手指屏幕操作;一旦检测到
ACTION_UP
事件(即手指离开屏幕)就记下当前滚动位置,然后延时 post 一个Runnable
到主线程;在这个
Runnable
中判断当前滚动位置是否和延时之前的位置相等(即 Y 方向位置不再变化),如果不相等则延时后继续 post 同样的Runnable
去检测。
可能有人会担心这样频繁的 post 会不会是开启了大量的线程很影响性能?
答案是否定的,Runnable
不同于 Thread
,它只是一个可执行对象,具体在哪个线程执行看情况。
比如这里实际上是发送了一个延时消息到UI线程的消息队列,由其 Looper
按照 FIFO 规则一个个抽取后给 Handler
去处理,而 UI 线程只有一个,所以并不是开启了很多线程。
亲测效果不错,不仅检测到的滚动 stop 状态很准确,而且也并不会影响滚动流畅性。
项目完整代码
- Android中实现ScrollView的滚动事件监听
- Android 中实现 ScrollView 的滚动事件监听
- Android 中实现 ScrollView 的滚动事件监听
- Android中实现ScrollView的滚动事件监听
- Android监听ScrollView的滚动事件
- Android中实现监听ScrollView滑动事件
- ScrollView滚动监听事件
- Android ScrollView的滚动事件
- Android ScrollView 滚动监听
- ScrollView中EditText的滚动监听
- Android中自定义ScrollView的滑动监听事件
- Android的ScrollView的滚动的监听以及屏幕静止状态的监听实现
- 监听ScrollView的滚动
- Android 中listview 和scrollview 滚动冲突事件的解决方法
- ANDROID监听SCROLLVIEW滚动事件_安卓触控类MOTIONEVENT
- Android对ScrollView滚动监听
- Android 对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果
- Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果
- Android Dialog修改小结
- 如何在编译器(vs2008)里设置调用别人写好的lib和dll
- gjango官网终于能进了
- Java中WebService实例
- Codeforces 479B. Towers 暴力
- Android 中实现 ScrollView 的滚动事件监听
- Test #2:Random
- 用perl获得当前日期
- ubuntu安装zabbix后,启动报错,zabbix_server is disabled in /etc/default/zabbix-server.
- 用Fusion Log诊断Could not load file or assembly问题
- 直面未来
- 关于Plants versus Zombies游戏中的Pogo stick玩具
- Apache Shiro Web Support学习笔记
- 让我知道生活如何教我做人