概述
Android HorizontalScrollView 如何实现滚动状态监听 ?
虽然HorizontalScrollView 本身有自带的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
* {@link #scrollBy(int, int)} or {@link #scrollTo(int, int)} having been
* called.
*
* @param l Current horizontal scroll origin.
* @param t Current vertical scroll origin.
* @param oldl Previous horizontal scroll origin.
* @param oldt Previous vertical scroll origin.
*/
protected void onScrollChanged(int l, int t, int oldl, int oldt)
下面是一种比较流行的实现滚动状态监听的方法:即在一定间隔轮询检测 getScrollX(),判断其是否改变,从而得出滚动状态。
//##################################################################################################
//############################# HorizontalScrollView实现滚动状态监听 ################################
//##################################################################################################
public class MyHorizontalScrollView extends HorizontalScrollView {
private static final String TAG = "MyHorizontalScrollView";
private Handler mHandler;
private ScrollViewListener mScrollViewListener;
/**
* 滚动状态:
* IDLE=滚动停止
* TOUCH_SCROLL=手指拖动滚动
* FLING=滚动
*/
enum ScrollType{IDLE,TOUCH_SCROLL,FLING};
/**
* 记录当前滚动的距离
*/
private int currentX = -9999999;
/**
* 当前滚动状态
*/
private ScrollType scrollType = ScrollType.IDLE;
public interface ScrollViewListener {
void onScrollChanged(ScrollType scrollType);
}
public MyHorizontalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
mHandler = new Handler();
mScrollViewListener = new ScrollViewListener() {
@Override
public void onScrollChanged(ScrollType scrollType) {
//TODO
}
});
}
/**
* 滚动监听runnable
*/
private Runnable scrollRunnable = new Runnable() {
@Override
public void run() {
if (getScrollX()==currentX) {
//滚动停止,取消监听线程
scrollType = ScrollType.IDLE;
if (scrollViewListener!=null) {
scrollViewListener.onScrollChanged(scrollType);
}
mHandler.removeCallbacks(this);
return;
} else {
//手指离开屏幕,但是view还在滚动
scrollType = ScrollType.FLING;
if(scrollViewListener!=null){
scrollViewListener.onScrollChanged(scrollType);
}
}
currentX = getScrollX();
//滚动监听间隔:milliseconds
mHandler.postDelayed(this, 50);
}
};
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
this.scrollType = ScrollType.TOUCH_SCROLL;
scrollViewListener.onScrollChanged(scrollType);
mHandler.removeCallbacks(scrollRunnable);
break;
case MotionEvent.ACTION_UP:
mHandler.post(scrollRunnable);
break;
}
return super.onTouchEvent(ev);
}
}
最后
以上就是重要钢笔为你收集整理的Android HorizontalScrollView 如何实现滚动状态监听的全部内容,希望文章能够帮你解决Android HorizontalScrollView 如何实现滚动状态监听所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复