requestDisallowInterceptTouchEvent(true)方法是用来子View告诉父容器不要拦截我们的事件的,但是这个代码放的位置很重要,可能导致失效。首先我们要知道父类肯定能收到Down事件的,因为这个是事件的起源,系统默认在VIewGroup里把requestDisallowInterceptTouchEvent里把子View对于Down事件的拦截权利剥削了,有了这个Down,它才会决定后面的事件是否传给子类,看代码
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- switch (ev.getAction()) {
- case MotionEvent.ACTION_DOWN:
- return false;
- case MotionEvent.ACTION_MOVE:
- if(true) {
- return true;
- }
- else {
- return false;
- }
- case MotionEvent.ACTION_UP:
- return true;
- default:
- break;
- }
-
- Log.e("TestView","父容器拦截");
- return false;
- }
代码可以看出,父类拦截了move和up事件,我们怎么让他失效呢,答案是在接受到down事件的方法里,而不是一开始就设置这个true标志,为什么呢,因为Viewgroup会在收到down事件时重置这个标志,如果太早设置就无效了。所以
子类应该这么写
- @Override
- public boolean dispatchTouchEvent(MotionEvent event) {
-
- getParent().requestDisallowInterceptTouchEvent(true);
- return super.dispatchTouchEvent(event);
- }
- 子类在收到父类的down事件时,去拦截,当然如果父类拦截了down事件,子类就没办法拦截他的其他事件了,
我这里都拦截了,当然down的时候必须拦截,其他让不让父View收到up事件就看情况,move父view肯定也收不到。
java编程语言代码示例
回复删除java编程从命令行隐藏密码