public class MyListView extends ListView {
// 滑动距离及坐标
private float xDistance, yDistance, xLast, yLast;
public MyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyListView(Context context) {
super(context);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
xLast = ev.getX();
yLast = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
final float curY = ev.getY();
xDistance += Math.abs(curX - xLast);
yDistance += Math.abs(curY - yLast);
xLast = curX;
yLast = curY;
if (xDistance > yDistance) {
return false; //表示向下传递事件
}
}
return super.onInterceptTouchEvent(ev);
}
}
在onInterceptTouchEvent这个方法里拦截。如果在x轴上的距离大于y轴上的距离表示是ViewPager的滑动,所以滑动处理交给ViewPager的OnTouchEvent来处理,ListView不处理。(代码里返回return false)
反之 return super.onInterceptTouchEvent(ev); 表示交给当前view(也就是ListView的触摸事件处理)。