从今天开始写读书笔记,希望自己每天都可以坚持下来,在Android开发的道路上越走越远。
一、事件分发的对象及其方法。
Android事件分发的对象有2个,View和ViewGroup。
View的事件有2个:dispatchTouchEvent() 和 onTouchEvent()
ViewGroup的事件有3个:dispatchTouchEvent() 、 onTouchEvent() 和 onInterceptTouchEvent()
二、触摸事件的类型。
触摸事件对应的是MotionEvent类,事件的主要类型有3种。
ACTION_DOWN:用户手指按下操作,一次按下操作标志着一次触摸事件的开始。
ACTION_MOVE:用户按下之后,手指在屏幕上滑动的操作。
ACTION_UP: 用户手指离开屏幕,一次提起操作标志着一次触摸事件的结束。
一次完整的Touch事件,至少由1次ACTION_DOWN和1次ACTION_UP和若干个(可以为0)ACTION_MOVE事件组成。
三、事件传递的三个阶段。
分发(Dispatch):事件的分发对应着dispatchTouchEvent方法,在Android系统中,所有的触摸事件都是通过这个方法来分发的。方法返回为true则表示该事件被消费,不往下进行分发,否则,进行事件分发。
拦截(Intercept):事件的拦截对应着onInterceptTouchEvent方法,这个方法只在ViewGroup及其子类中才存在。返回true表示拦截这个事件,不继续分发给子视图,同时交由自身的onTouchEvent方法进行消费,否则表示不对事件进行拦截,需要继续分发给子视图。
消费(Consume):事件的消费对应着onTouchEvent方法,该方法返回true表示当前视图可以处理对应的事件,事件将不会向上传递给父视图;返回false表示当前视图不处理这个事件,事件会被传递给父视图的onTouchEvent方法进行处理。
四、事件分发流程图。
1.View的一次点击事件图:
2.ViewGroup中的View的点击事件流程:
五、总结。
1.事件分发都是从外层向内层进行分发,若不干涉,则会传递到视图底层进行事件处理;
2.ViewGroup通过onInterceptTouchEvent方法对事件进行拦截,如果该方法返回true,则事件不会传递到子View;
3.在子View中对事件进行消费后,ViewGroup将接受不到任何事件。