android事件分发机制


网上很多介绍事件分发机制的,都讲的云里雾里。自己动手写了个demo,现在将完整结论总结如下:


首先说明有三个相关方法

1)public boolean dispatchTouchEvent(MotionEvent ev)  这个方法用来分发TouchEvent


2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent


3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent



涉及到activity的方法:

public boolean dispatchTouchEvent(MotionEvent ev) 

public boolean onTouchEvent(MotionEvent ev) 


涉及到viewGroup的方法:

public boolean dispatchTouchEvent(MotionEvent ev) 

public boolean onInterceptTouchEvent(MotionEvent ev) 

public boolean onTouchEvent(MotionEvent ev) 



涉及到view的方法:
public boolean dispatchTouchEvent(MotionEvent ev) 
public boolean onTouchEvent(MotionEvent ev) 



完整传递路径:  根布局到子布局分发,子布局到根布局处理。

即分发是 Activity ---> ViewGroup --->View

    处理是 View ---> ViewGroup --->Activity



activity dispatchTouchEvent
viewGroup dispatchTouchEvent
viewGroup onInterceptTouchEvent
view  dispatchTouchEvent
view onTouchEvent
viewGroup onTouchEvent
activity onTouchEvent




三个方法的传递过程说明:

1)dispatchTouchEvent


                                   如果调用 super.dispatchTouchEvent(ev),并且return false,会继续传递;

                                   如果调用 super.dispatchTouchEvent(ev),并且return true,会继续传递直到当前view的onTouchEvent被调用;

                                   如果直接 return true 终止传递

                                   如果直接 return false 会从当前view的父布局(即当前层级的上一层级)的onTouchEvent开始继续传递;
  (super.dispatchTouchEvent(ev)会去调用继续传递逻辑)


2)onInterceptTouchEvent 

                                    如果return true 会从当前view(当前层级)的onTouchEvent开始继续传递;

                                    如果return false 会继续传递;

(有没有调用super.onInterceptTouchEvent(ev)对路径链没有影响;因为ViewGroup的这个方法只是返回了false)



3)onTouchEvent 

                                    如果return true 会终止传递

                                    如果return false 会继续传递;




需要说明的是,以上结论把Activity当作ViewGroup的上一层级,继续传递的意思是继续按照完整传递路径来传递事件。

另外,onTouchEvent的return true,会引起当前view到根布局的dispatchTouchEvent返回值为true;dispatchTouchEvent的return true,会引起当前view到根布局的dispatchTouchEvent返回值为true。



好了,关于事件分发就说到这里。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值