事件分发测试结果与理解总结
* 总结: * 事件分发其实调用机制应该是这样的:(这里说的仅仅是系统的,其他的可能中途修改不一定是这样) * 总: dispatchTouchEvent会在在super.dispatchTouchEvent中最终会调用onTouchEvent, 以及onInterceptTouchEvent方法 * 1.在调用onTouchEvent作为本事件是否被消耗了,如果自己没消耗会由父来消耗,如果使用了 * requestDisallowInterceptTouchEvent阻止父消耗,则会由Activity消耗以此结束 * 2.在调用onInterceptTouchEvent方法中根据返回判断是否需要调用子dispatchTouchEvent事件, * super.onInterceptTouchEvent默认返回false * 3.当子View把down 事件消耗了requestDisallowInterceptTouchEvent(true)才能把后续的事件交给子View,并且不再调用父的onTouchEvent * 4.当事件分发下去,onInterceptTouchEvent在调用子View的requestDisallowInterceptTouchEvent时候如果down事件返回的false, * 那么后续事件onInterceptTouchEvent也不会再给子view了,转而调用自己的Touch * 5.事件消耗,可以在onTouchEvent返回true ,或者dispatchTouchEvent 是true 综上所述:底层简写代码应是这样的 boolean isContinuDispatch=true;//后续事件继续分发 boolean interceptTouchEvent=false;//是否调用自己的触摸事件(因为如果子view requestDisallowInterceptTouchEvent(true)自己的touch就无效了) public boolean dispatchTouchEvent(MotionEvent ev) { //判断自己是否需要拦截 if (onInterceptTouchEvent(ev)){ //按下事件判断后续事件是否还需要分发 if (ev.getAction()==MotionEvent.ACTION_DOWN){ return isContinuDispatch=子View.dispatchTouchEvent(ev); }else { //其他事件 if (isContinuDispatch){ return 子View.dispatchTouchEvent(ev); } } } //没有被子View拦截,并且子View后续是不收的 if (!interceptTouchEvent &&!isContinuDispatch){ //自己触摸事件决定是否消耗 return onTouchEvent(ev); }else { //被阻止,事件没有被消耗,只能有Activity的OnTouch处理了 return false; } }
以上总结是我自己测试的结果,与网上说法不一样,有些疑惑,还望大神指点