#安卓学习之事件分发
##事件分发涉及3个方法
1.public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
手按下时调用
case MotionEvent.ACTION_DOWN:
break;
手按移动调用
case MotionEvent.ACTION_MOVE:
break;
手按离开调用
case MotionEvent.ACTION_UP:
break;
default:
break;
return super.dispatchTouchEvent(ev);
}
@Override
2.public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
手按下时调用
case MotionEvent.ACTION_DOWN:
break;
手按移动调用
case MotionEvent.ACTION_MOVE:
break;
手按离开调用
case MotionEvent.ACTION_UP:
break;
default:
break;
return super.onTouchEvent(event);
}
//拦截事件方法,只有容器类组件有此方法
@Override
3.public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
手按下时调用
case MotionEvent.ACTION_DOWN:
break;
手按移动调用
case MotionEvent.ACTION_MOVE:
break;
手按离开调用
case MotionEvent.ACTION_UP:
break;
default:
break;
return super.onInterceptTouchEvent(ev);
}
##如图所示三个颜色分别代表三个控件
紫:继承view
黄: 继承LinearLayout
蓝:继承RelativeLayout
#控件叠加之事件分发
###以上三个颜色依次叠加在一个容器里
###点击紫
1.叠加在最表面的控件先执行以上三个方法,然后依次向内执行(默认执行顺序)
2.哪个方法返回true就不再向下执行
紫:dispatchTouchEvent。。。DOWN
紫:onTouchEvent。。。。。。DOWN
黄:dispatchTouchEvent。。。DOWN
黄:onInterceptTouchEvent。DOWN
黄:onTouchEvent。。。。。。DOWN
蓝:dispatchTouchEvent。。。DOWN
蓝:onInterceptTouchEvent。DOWN
蓝:onTouchEvent。。。。。。DOWN
都没有处理这个事件,最后被activity处理了,所以手放开后,这几个控件的事件处理方法不再被调用
3.如果给黄色设置点击事件(点击紫)
紫:dispatchTouchEvent。。。DOWN
紫:onTouchEvent。。。。。。DOWN
黄:dispatchTouchEvent。。。DOWN
黄:onInterceptTouchEvent。DOWN
黄:onTouchEvent。。。。。。DOWN
放手时调用,只调用处理了此事件的view的方法
黄:dispatchTouchEvent。。。UP
黄:onTouchEvent。。。。。。UP
黄:onClick
#父控件子控件之事件分发
###将紫色作为子控件放到黄色里,再将黄色作为子控件放到蓝色里
###点击紫
1.由父控件向里依次执行如下方法,再由里到外执行onTouchEvent方法(点击紫)
(手按下和放开)
蓝:dispatchTouchEvent。。。。DOWN
蓝:onInterceptTouchEvent。。DOWN
黄:dispatchTouchEvent。。。。DOWN
黄:onInterceptTouchEvent。。DOWN
紫:dispatchTouchEvent。。。。DOWN
紫:onTouchEvent。。。。。。。DOWN
黄:onTouchEvent。。。。。。。DOWN
蓝:onTouchEvent。。。。。。。DOWN
都没有处理这个事件,最后被activity处理了,所以手放开后,这几个控件的事件处理方法不再被调用
2.当黄色的onTouchEvent返回true(点击紫)
事件也要先传递到最里面的子控件,再由里到外执行onTouchEvent方法,直到执行到返回ture的为止。当手放开时事件只传到onTouchEvent返回true的那个控件。
(手按下)
蓝:dispatchTouchEvent。。。。。DOWN
蓝:onInterceptTouchEvent。。。。DOWN
黄:dispatchTouchEvent。。。。。DOWN
黄:onInterceptTouchEvent。。。。DOWN
紫:dispatchTouchEvent。。。。。DOWN
紫:onTouchEvent。。。。。。。。DOWN
黄:onTouchEvent。。。。。。。。DOWN
(手放开)
蓝:dispatchTouchEvent。。。。。UP
蓝:onInterceptTouchEvent。。。UP
黄:dispatchTouchEvent。。。。。UP
黄:onTouchEvent
3.截断获共享事件的操作
一般不改写dispatchTouchEvent的方法,而是重写onInterceptTouchEvent方法
或者控制返回值true或false.
4.如果给黄设置点击事件,则代表黄的onTouchEvent返回true(点击紫)
点击事件的方法在抬手后调用,如下:
(手按下)
蓝:dispatchTouchEvent。。。。。DOWN
蓝:onInterceptTouchEvent。。。。DOWN
黄:dispatchTouchEvent。。。。。DOWN
黄:onInterceptTouchEvent。。。。DOWN
紫:dispatchTouchEvent。。。。。DOWN
紫:onTouchEvent。。。。。。。。DOWN
黄:onTouchEvent。。。。。。。。DOWN
(手放开)从父控件开始调用方法,直到手按下时处理了那个事件的View为止
蓝:dispatchTouchEvent。。。。。UP
蓝:onInterceptTouchEvent。。。UP
黄:dispatchTouchEvent。。。。。UP
黄:onTouchEvent。。。。。。。。。UP
黄:test(3821): onClick