我是靠谱客的博主 重要钢笔,最近开发中收集的这篇文章主要介绍Android HorizontalScrollView 如何实现滚动状态监听,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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 如何实现滚动状态监听所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部