Android 事件的传递
简单描述一下布局父布局ViewGroup A包含布局ViewGroup B,父布局ViewGroup B包含布局 View C,用户此时点击View C,事件是如何传递的呢?
首先有一下结论:
1、事件永远是最先到达父控件(最先到A)
2、ViewGroup的事件分为分发(dispatchTouchEvent)、拦截(onInterceptTouchEvent)、消耗(onTouchEvent);
3、分发(父->子),处理(子->父);
4、View属于子布局,不能再包含其他View,它没有拦截事件(onInterceptTouchEvent)。
事件传递描述:
当用户点击View C首先父布局A先触发dispatchTouchEvent(),然后会调用A自身的onInterceptTouchEvent(),如果return true表示拦截则直接执行A的onTouchEvent(),如果return false,则传递给B,首先会执行B的dispatchTouchEvent(),然后调用B自身的onInterceptTouchEvent(),如果return true,则表示B拦截了,会直接执行B的onTouchEvent()事件,如果这个onTouchEvent()return true,则表示消耗掉这个事件,不在向父布局A传递,如果return false,则表示不消耗,传递给父布局A的onTouchEvent()来处理,如果B的onInterceptTouchEvent()返回false,则会传递给View C,会执行C的dispatchTouchEvent(),然后调用C的onTouchEvent(),如果return true 表示消耗掉,如果return false表示不处理会向外层ViewGroup B的onTouchEvent()传递,如果B的onTouchEvent()返回true则消耗掉,返回false则向外层ViewGroup A的onTouchEvent()传递,如果A的onTouchEvent()返回true表示消耗掉,如果返回false表示不执行。
ps:如果自定义ViewGroup,重写dispatchTouchEvent(),没有执行父布局
return super.dispatchTouchEvent(ev);
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return true;//或者return false;
}
都不会把事件传递下去的,后边的方法都不会响应。
O(∩_∩)O哈哈~,是不是感觉很绕,执行流程就是这样的,如果我理解有问题,要通知我哟