一个可以监听滑动方向的自定义ViewPager

一个自定义ViewPager,可以监听ViewPager的滑动方向。

实现的原理是在ViewPager初始化的时候设置OnPageChangeListener,当ViewPager滑动时会回调onPageScrolled()方法,根据返回的positionOffset判断ViewPager的滑动方向。

/**
 * 一个自定义的ViewPager,可以监听ViewPager的滑动方向
 * Created by lwx on 2016-10-10.
 */

public class CustomViewPager extends ViewPager {
    public static final int SLIDE_LEFT_TO_RIGHT = 0x001;  //从左向右滑动
    public static final int SLIDE_RIGHT_TO_LEFT = 0x002;  //从右向左滑动
    private float lastValue;
    private boolean isScrolling = false;  //viewpager是否滑动
    private boolean isRightToLeft = false;  //从右向左滑动
    private boolean isLeftToRight = false;  //从左向右滑动
    private PageStateChangeListener mPageStateChangeListener;

    public CustomViewPager(Context context) {
        super(context, null);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        addOnPageChangeListener(mOnPageChangeListener);
    }

    /**
     * 监听滑动状态
     */
    OnPageChangeListener mOnPageChangeListener = new OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            if (positionOffset == 0.0){
                return;
            }
            if (lastValue > positionOffset) {
                // 递减,从左向右滑动
                isRightToLeft = false;
                isLeftToRight = true;
            } else if (lastValue < positionOffset) {
                // 递增,从右向左滑动
                isRightToLeft = true;
                isLeftToRight = false;
            } else if (lastValue == positionOffset) {
                isLeftToRight = isRightToLeft = false;
            }
            lastValue = positionOffset;
            isScrolling = true;

            if (mPageStateChangeListener != null){
                mPageStateChangeListener.onPageScrolled(position, positionOffset, positionOffsetPixels);
            }
        }

        @Override
        public void onPageSelected(int position) {
            if (mPageStateChangeListener != null){
                mPageStateChangeListener.onPageSelected(position);
            }
        }
        @Override
        public void onPageScrollStateChanged(int state) {
            if (mPageStateChangeListener == null){
                return;
            }

            mPageStateChangeListener.onPageScrollStateChanged(state);
            if (isScrolling){
                if (state == ViewPager.SCROLL_STATE_IDLE) {
                    if (isLeftToRight) {
                        mPageStateChangeListener.onSlideDirection(SLIDE_LEFT_TO_RIGHT);
                    } else if (isRightToLeft) {
                        mPageStateChangeListener.onSlideDirection(SLIDE_RIGHT_TO_LEFT);
                    }
                }
                isScrolling = false;
            }
        }
    };

    /**
     * 滑动状态改变回调
     */
    public interface PageStateChangeListener {
        void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);
        void onPageSelected(int position);
        void onPageScrollStateChanged(int state);
        void onSlideDirection(int slideState);
    }

    /**
     * 设置监听
     */
    public void setPageChangeListener(PageStateChangeListener pageStateChangeListener){
        this.mPageStateChangeListener = pageStateChangeListener;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,366评论 25 709
  • 我的CSDN博客同步发布:ViewPager源码分析(2):滑动及冲突处理 转载请注明出处:【huachao100...
    huachao1001阅读 5,313评论 2 34
  • 我并非杰伦的忠实粉丝,但也是听着他的歌走过青春。今天在网上看到了一个关于杰伦的小视频,视频内容是关于杰伦出道历程,...
    小乙采尘阅读 1,045评论 0 1
  • 深夜被蚊子咬醒,心慌,烦躁!睡眼开灯,清楚看到那蚊子肚子胀得都快爆了,飞行都困难,尔后爬在墙壁上酣睡,我舍不...
    归一堂阅读 201评论 0 0
  • 路上可以遇见很多不同的丰富的万物形态,如果你足够有心,也许那会成为你单薄生活里的惊喜。最近一次印象深刻的遇见是发生...
    喜多卉阅读 252评论 0 1