一、小故事目标
帮助Android初级和中级开发同学,可以更容易理解Android事件传递机制。本文旨在以故事的形式,让Android事件传递机制更加形象生动,帮助读者入门。入门之后,读者可以再去看其他更有深度的博文,或者自己去阅读源码也未尝不可。
二、百字小故事
A地发生了车祸。B交警指挥中心需要去负责处理。B交警指挥中心了解情况后,觉得需要派人去现场。B交警指挥中心安排了D交警去负责处理。D交警对事故进行处理,并把结果上报给B交警指挥中心。
三、小故事拆解
A地:Android Framework
车祸:MotionEvent(点击事件)
A地发生了车祸:Android Framework收到MotionEvent
B交警指挥中心:ViewGroup
负责处理:dispatchTouchEvent(MotionEvent)
B交警指挥中心需要去负责处理:ViewGroup的dispatchTouchEvent(MotionEvent)被调用
B交警指挥中心了解情况后,觉得需要派人去现场:ViewGroup的onInterceptTouchEvent(MotionEvent)被调用,并返回false
B交警指挥中心安排了D交警去负责处理:ViewGroup调用了View的dispatchTouchEvent(MotionEvent)
进行处理:onTouchEvent(MotionEvent)
D交警对事故进行处理,并把结果上报给B交警指挥中心:View的onTouchEvent(MotionEvent)结果为true,并返回给ViewGroup的dispatchTouchEvent(MotionEvent)。
四、小故事重点
dispatchTouchEvent(MotionEvent):表示负责处理,其实也是ViewGroup或View对外的接口。表达把责任传递给它。
onTouchEvent(MotionEvent):表示进行处理,其实就是具体的处理细节。
onInterceptTouchEvent(MotionEvent):表示判定是否要把责任交给下级,也就是是否调用子View的dispatchTouchEvent(MotionEvent)。
五、小故事代码
1. ViewGroup.dispatchTouchEvent(MotionEvent)
2. ViewGroup.onInterceptTouchEvent(MotionEvent)返回false
3. View.dispatchTouchEvent(MotionEvent)
4. View.onTouchEvent(MotionEvent)
六、小故事扩展
View中还有一个setOnTouchListener(OnTouchListener)方法。OnTouchListener可以理解为D交警还有一个实习生C。onTouch(View, MotionEvent)返回true表示实习生可以解决,就不再需要调用onTouchEvent(MotionEvent)让交警来解决了。
七、小故事演练
不同的调用情况,可以对应到这个故事框架中的不同情况中去。可以去找一个Android事件传递U型图的博客,对照着讲下这个车祸小故事。当然,为了方便读者演练,也有一个对应的demo代码,可以自己调试:afunx/XFun: It is a Android project. Just for fun. (github.com)
链接中包含其他demo代码。事件传递相关的,请查看TouchEventMainActivity.java、TouchDemoView.java和TouchDemoViewGroup.java。也可以写出你自己的小故事。