判断在左右边界时是否继续滑动的ViewPager

最近项目比较忙,一个项目接着一个项目,遇到的问题也不少,其中有一个需求是要实现ViewPager的两级联动,在ViewPager处于边界的时候,继续滑动,标题要进行切换,大概想了一下不是很复杂,简单的实现一下.

一、需求分析

需要在ViewPager在边界的时候,继续滑动时做出处理,可以通过判断当前是否是边界页面的时候对点击滑动的距离进行记录,来通过滑动的值判断方向从而确定是否是边界滑动,设置一个临界值来判断是否为滑动,最后确认为边界滑动后通过回调来进行后续操作.


二、代码实现

代码不是很复杂,直接贴代码了


import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/**
 * Created by junweiliu on 16/9/20.
 */
public class SideViewPager extends ViewPager {
    /**
     * 开始点击的位置
     */
    private int startX;
    /**
     * 临界值
     */
    private int criticalValue = 200;

    /**
     * 边界滑动回调
     */
    public interface onSideListener {
        /**
         * 左边界回调
         */
        void onLeftSide();

        /**
         * 右边界回调
         */
        void onRightSide();
    }

    /**
     * 回调
     */
    private onSideListener mOnSideListener;

    /**
     * 设置回调
     *
     * @param listener
     */
    public void setOnSideListener(onSideListener listener) {
        this.mOnSideListener = listener;
    }

    /**
     * 设置临界值
     *
     * @param criticalValue
     */
    public void setCriticalValue(int criticalValue) {
        this.criticalValue = criticalValue;
    }

    public SideViewPager(Context context) {
        this(context, null);
    }

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


    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startX = (int) event.getX();
                break;
        }
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE:
                if (startX - event.getX() > criticalValue && (getCurrentItem() == getAdapter().getCount() - 1)) {
                    if (null != mOnSideListener) {
                        mOnSideListener.onRightSide();
                    }
                }
                if ((event.getX() - startX) > criticalValue && (getCurrentItem() == 0)) {
                    if (null != mOnSideListener) {
                        mOnSideListener.onLeftSide();
                    }
                }
                break;
            default:
                break;
        }
        return super.onTouchEvent(event);
    }
}

需要注意的是,获取开始点击的位置时,要在dispatchTouchEvent或者onInterceptTouchEvent中去获取,在onTouchEvent中是获取不到值的,这是因为点击事件分发的原因,有很多关于这方面的文章,有兴趣可以去看一下.

具体使用的话也很简单,实现回调方法即可

mViewPager.setOnSideListener(new SideViewPager.onSideListener() {
            @Override
            public void onLeftSide() {
               // 左边界滑动时处理
               ...
            }

            @Override
            public void onRightSide() {
                 // 右边界滑动时处理
               ...
            }
        });
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值