监听ScrollView的滑动距离和滑动状态
2015-03-27 11:57
429 查看
原生的ScrollView并没有实现类似ListView的onScrollListener的接口,在开发中需要监听ScrollView滑动状态,比如滑动到顶部(底部),滑动的距离等等。
在onTouchListener中可以监听到用户的点击行为,但是ScrollView在MotionEvent.Action_UP之后还会滑动一段距离,这时候就需要起一个延时的handler,这个handler实时记录当前ScrollView的滑动距离,以此来判断滑动状态
此方法可行,但是实现起来颇为麻烦,监听的灵敏度和效率都比较低。在ScrollView中尝试去重写其中的onScrollChanged方法,并将其参数通过接口暴露出来,可以实现对ScrollView滑动事件的监听。
onScrollChanged有四个参数,官方文档对其介绍如下
This is called in response to an internal scroll in this view (i.e., the view scrolled its own contents). This is typically as a result of
Overrides: onScrollChanged(...) in View
Parameters:l Current horizontal scroll origin.t Current vertical scroll origin.oldl Previous horizontal scroll origin.oldt Previous vertical scroll origin.
t是当前上下滑动的位置,oldt上一次滑动的位置,通过处理t和oldt,可以判断当前的滑动状态,如滑动到顶部,滑动到底部,滑动方向等,从而实现对ScrollView滑动的监听。当然我并不建议在这个方法中进行非常耗时的处理和计算,可能影响ScrollView滑动的流畅性
在onTouchListener中可以监听到用户的点击行为,但是ScrollView在MotionEvent.Action_UP之后还会滑动一段距离,这时候就需要起一个延时的handler,这个handler实时记录当前ScrollView的滑动距离,以此来判断滑动状态
interface onScrollListener{ void onScrollStop(); void onScroll(int y); } scrollView.setOnTouchListener(new OnTouchListener() { private int lastY = 0; private int touchEventId = 1001; private OnScrollListener listener; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); View scroller = (View) msg.obj; if (msg.what == touchEventId) { if (lastY == scroller.getScrollY()) { //滑动停止 listener.onScrollStop(); } else { handler.sendMessageDelayed(handler.obtainMessage(touchEventId, scroller), 1); lastY = scroller.getScrollY(); listener.onScroll(lastY); } } } }; @Override public boolean onTouch(View v, MotionEvent event) { isScoll = false; int eventAction = event.getAction(); int y = (int) event.getRawY(); switch (eventAction) { case MotionEvent.ACTION_UP: handler.sendMessageDelayed(handler.obtainMessage(touchEventId, v), 5); break; default: break; } return false; } });
此方法可行,但是实现起来颇为麻烦,监听的灵敏度和效率都比较低。在ScrollView中尝试去重写其中的onScrollChanged方法,并将其参数通过接口暴露出来,可以实现对ScrollView滑动事件的监听。
onScrollChanged有四个参数,官方文档对其介绍如下
This is called in response to an internal scroll in this view (i.e., the view scrolled its own contents). This is typically as a result of
scrollBy(int, int)or
scrollTo(int, int)having been called.
Overrides: onScrollChanged(...) in View
Parameters:l Current horizontal scroll origin.t Current vertical scroll origin.oldl Previous horizontal scroll origin.oldt Previous vertical scroll origin.
t是当前上下滑动的位置,oldt上一次滑动的位置,通过处理t和oldt,可以判断当前的滑动状态,如滑动到顶部,滑动到底部,滑动方向等,从而实现对ScrollView滑动的监听。当然我并不建议在这个方法中进行非常耗时的处理和计算,可能影响ScrollView滑动的流畅性
相关文章推荐
- ios-day05-03(实现UIScrollViewDelegate协议,监听ScrollView的缩放、滑动等状态)
- Android 监听ScrollView滑动距离简单处理
- 监听ScrollView滑动状态
- Android 自定义ScrollView嵌套滚动兼容,监听滑动状态:顶部、底部、停止、滑动中
- 小距离监听ListView或者ScrollView上下滑动
- Android中自定义ScrollView的滑动监听事件,并在滑动时渐变标题栏背景颜色
- Android ScrollView滚动距离和判断滚动停止状态
- Android ScrollView滑动监听
- 在 tableview的上面 添加 一个view, 下面 加一个 button,都是 监听 scrollview的滑动而已,
- Android 监听 ScrollView 滑动到最底部
- ScrollView的滑动监听
- Android 监听ScrollView的滑动
- ScrollView监听滑动到底部、顶部
- 彻底解决监听Scrollview滑动暂停问题
- 监听ScrollView上下滑动
- ScrollView滑动监听
- ScrollView的滑动监听(以HorizontalScrollView为例)
- Android控件:ScrollView的使用,滑动到底部的监听
- 学习笔记之——自定义带滑动距离监控和仿iOS回弹效果的ScrollView
- DrawerLayout的使用 侧滑加载Listview,首页使用Fragment和处理点击触摸冲突、穿透事件和监听菜单滑动状态的改变的详细介绍