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肯定也收不到。