您的位置:首页 > 其它

监听ScrollView的滑动距离和滑动状态

2015-03-27 11:57 429 查看
原生的ScrollView并没有实现类似ListView的onScrollListener的接口,在开发中需要监听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滑动的流畅性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: