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

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

(1)拦截dispatchTouchEvent事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@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)设置触摸监听

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

1
2
3
4
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
return true;
}

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

1
2
3
4
5
6
mViewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
});

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

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :