解决Android ViewPager不能响应onTouchListener的问题

解决思路主要是复写ViewPager中的dispatchTouchEvent函数,在分发之前记录事件,具体代码如下:

(1)拦截dispatchTouchEvent事件

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (mOnViewPagerTouchEventListener != null) {
                mOnViewPagerTouchEventListener.onTouchDown(ev.getX(), ev.getY());
            }
            break;
        case MotionEvent.ACTION_MOVE:
            if (mOnViewPagerTouchEventListener != null) {
                mOnViewPagerTouchEventListener.onTouchMove(ev.getX(), ev.getY());
            }
            break;
        case MotionEvent.ACTION_UP:
            if (mOnViewPagerTouchEventListener != null) {
                mOnViewPagerTouchEventListener.onTouchUp(ev.getX(), ev.getY());
            }
            break;
        case MotionEvent.ACTION_CANCEL:
            if (mOnViewPagerTouchEventListener != null) {
                mOnViewPagerTouchEventListener.onTouchCancel(ev.getX(), ev.getY());
            }
            break;
    }
    return super.dispatchTouchEvent(ev);
}

private OnViewPagerTouchEventListener mOnViewPagerTouchEventListener;

public void setOnViewPagerTouchEventListener(OnViewPagerTouchEventListener listener){
    mOnViewPagerTouchEventListener = listener;
}

public interface OnViewPagerTouchEventListener {
    void onTouchDown(float x, float y);
    void onTouchUp(float x, float y);
    void onTouchMove(float x, float y);
    void onTouchCancel(float x, float y);
}

(2)设置触摸监听

mViewPager.setOnViewPagerTouchEventListener(new BannerView.OnViewPagerTouchEventListener() {
    @Override
    public void onTouchDown(float x, float y) {

    }

    @Override
    public void onTouchUp(float x, float y) {

    }

    @Override
    public void onTouchMove(float x, float y) {

    }

    @Override
    public void onTouchCancel(float x, float y) {

    }
});

还有一个有弊端的思路,也可以响应onTouchListener

(1)复写ViewPager中的onInterceptTouchEvent函数,直接返回true

@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
    return true;
}

(2)直接为ViewPager设置onTouchListener即可监听到事件

mViewPager.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return false;
    }
});

但是该方法会有致命的问题,每一个Item都无法再接收事件

上一篇 Java中使用Gradle中声明的变量
下一篇 RecyclerView GridLayoutManager实现复杂的列数变化的布局
目录
文章列表
1 为VuePress自动生成侧边栏分组的插件
为VuePress自动生成侧边栏分组的插件
2
Logstash使用日志记录时间替换@timestamp
Logstash使用日志记录时间替换@timestamp
3
CentOS下部署Magento2
CentOS下部署Magento2
4
Android sdkmanager 代理配置
Android sdkmanager 代理配置
5
Atlas远程bundle配置及更新
Atlas远程bundle配置及更新
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。