欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

ViewPager边界监听事件_判断左右边界继续滑动事件

程序员文章站 2021-12-30 07:14:15
...

最近项目比较忙,一个项目接着一个项目,遇到的问题也不少,其中有一个需求是要实现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() {
        // 右边界滑动时处理
        ...
    }
});


若资源对你有帮助,浏览后有很大收获,不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力。

想获取DD博客最新代码,你可以扫描下方的二维码,关注DD博客微信公众号(ddblogs)。

或者你也可以关注我的新浪微博,了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间,可以对该博文进行评论,希望不吝赐教。

为保证及时回复,可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问,祝你生活愉快、工作顺心、欢迎常来逛逛。