**首先:在父view里面重新拦截方法,判断他是一个滑动事件的时候return true,将事件拦截给自己的ontouchEvent。
**
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
switch (event.getAction()) {重点内容
case MotionEvent.ACTION_DOWN:
startY = (int) event.getRawY();
case MotionEvent.ACTION_MOVE:
endY = (int) event.getRawY();
if (Math.abs(Math.abs(startY) - Math.abs(endY)) < 10) {
return super.onInterceptTouchEvent(event);
} else {
return true;
}
case MotionEvent.ACTION_UP:
startY = (int) event.getRawY();
break;
case MotionEvent.ACTION_CANCEL:
startY = (int) event.getRawY();
break;
default:
break;
}
return super.onInterceptTouchEvent(event);
}
然后:再重写onTouchEvent
@Override
public boolean onTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
打印down
break;
case MotionEvent.ACTION_MOVE:
打印move
break;
case MotionEvent.ACTION_UP:
打印up
break;
default:
break;
}
return super.onTouchEvent(ev);
}
此时发现运行滑动屏幕只有down事件,因为没有消费down事件不会有move和up事件产生。 所以我们把布局改成中间放一个有点击事件的button,如下:
此时如果点击button以外的部分滑动一段距离,发现依然只有down,因为没人消费down事件。 此时如果点击button滑动一段距离,发现底层的布局打印出了move和up,并没有down。 原因是:button要消费这个down事件所以产生了move和up,但是当你滑动一段距离时,down是给了button消费了,产生的move和up被拦截给了底层的布局
**
这时候有特殊的情况,比如底层布局是一个ScrollView:
你会发现,此时如果点击button以外的部分滑动一段距离,发现有down,move和up,并没有view去消费这个down,为何会有move和up? 其实这个问题很简单,因为scrollview是可以点击的,也就是clickable = true的。其实默认的scrollview自动就是消费了这个down,所以会有move和up. 此时如果点击button滑动一段距离,发现底层的布局打印出了move和up,并没有down。原因是一样的,button消费了down,拦截给底层后,已经没有down了,只剩下move和up。
既然ScrollView是自己就有消费down,那么我在ontouchevent里面return true会怎样呢? 结果就是ScrollView无法滑动了。因为滑动是写在 super.onTouchEvent();里面的。只有return super.onTouchEvent();才能滑动。
**