-
每个Activity持有Window窗体,而Window是个抽象类,其唯一的实现类是PhoneWindow,所以Window的
superDispatchTouchEvent
方法就是调用PhoneWindow的DispatcherToucherEvent方法,,实现的调用DecorView的 SuperDispatcherToucherEvent方法(PhoneWindow持有DecorView)。DecorView继承自FrameLayout(内部没有实现SuperDispatcherToucherEvent方法),FrameLayout继承自ViewGroup(实现SuperDispatcherToucherEvent方法)。
public boolean superDispatchTouchEvent(MotionEvent event) { return mDecor.superDispatchTouchEvent(event); }
,
查看全部 -
ACTIon_DOWN按下
ACTIon_MOVE移动
ACTIon_up 离开
action_cancel 取消
查看全部 -
Activity 事件分发
查看全部 -
Activity
dispatchTouchEvent(MotionEvent ev) 事件分发
onTouchEvent(MotionEvent event) 事件触摸
查看全部 -
Activity 负责生命周期和处理事件。
Window负责视图的控制。
一个Activity包含了一个Window, 一个Window才真正代表了一个窗口。
Window包含了一个顶级的View -> DecorView
Activity中setContentView的视图就是DecorView的子元素。
所有的事件都要经过DecorView才会传递给我们的View。
传递层级:Activity->Window->DecorView->ViewGroup->View
事件传递的三个主要对象:Activity、ViewGroup、View
查看全部 -
事件序列:从手指按下屏幕开始,到手指离开屏幕所产生的一系列事件。
传递层级:Activity->Window->DecorView->ViewGroup->View
查看全部 -
熟记流程图、翻看源码
查看全部 -
事件默认传递流程和在同一事件序列中的变化
查看全部 -
分别创建了MyActivity extends Activity,MyViewGroup extends FrameLayout,MyView extends View
然后分别重写他们需要的方法dispatchTouchEvent、onTouchEvent,特别的是在ViewGroup中多重写一个onInterceptTouchEvent
根据流程图,可以发现
传递顺序Activity-ViewGroup-View
由上自下的dispatvhTouchEventh互相传递后,到由下而上的onTouchEvent互相传递
查看全部 -
以上进入分发的过程。判断是否符合安全策略。符合安全策略-继续,是鼠标-结束不分发,
注册了touchListener方法,里面的onTouch方法返回true标志着事件被消费了。
查看全部 -
如果不是取消事件并且没有被分发,继续分发处理。
当前动作是按下、移动时,首先清空之前所有的触摸点信息。然后获取到可以接收的子view的集合
从前到后遍历子view,尝试找到真正点击的view。
用户没有定义了view的绘制顺序,返回当前下标。
定义了的话,通过getChildDrawingOrder获取View的下标,需要重写这个方法。
所以一般返回i。
在view列表中拿出view,否则在children中拿出。
查看全部 -
*** 看库或框架的源码时,需要的是捋清楚代码的思路,理解核心思想,而不是明白其中每一行代码的实现。
接下来判断onInterceptTouchEvent方法的值
发现一般情况下这个方法都会返回false,因为点击来源!=鼠标等等。
查看全部 -
第一个判断:这个值在View中可以找到,是个检测用的对象
第二个判断:提供的辅助功能的选项,帮助有障碍的用户的使用,不影响方法调用
接下来正式进入事件分发的逻辑代码中
判断安全策略,
查看全部 -
* dispatchTouchEvent 标志着事件进入到了ViewGroup里面。首先被调用到。
* onInterceptTouchEvent 在过程中被调用。true=当前ViewGroup消费掉。false=传递下去。
* onTouchEvent ViewGroup没有onTouchEvent方法的实现,他是在View中实现的。
应用场景:希望事件进行到ViewGroup终止,不传输到子View中,用户的触摸事件自行处理。
处理:重写onInterceptTouchEvent并返回true,同时重写onTouchEvent方法,在其中编写事件处理逻辑即可。
查看全部 -
事件未被消费,当前视图都没能处理掉这个事件,才会去调用Activity的onTouchEvent方法,且他的返回值作为dispathchEvent的返回值。
查看Activity中onTouchEvent方法的实现逻辑,发现其中一个的判断逻辑很重要,如果返回为true则会关闭当前界面且返回true。
查看Window中shouldCloseOnTouch方法,当这三个bolean值均为true时返回true。
* mCloseOnTouchOutside=true这个值表示当前Activity支持点击空白区域让acitvity消失。这个变量一般在downLoad的时候这个值才为true。
* peekDecorView的实现在PhoneWindow,返回的是当前的dectorView。
* isOutside =true 表示当前触摸的点击事件是在顶层View DoctorView之外的,没有点击到DoctorView里面。
Activity整体传递流程比较线性,如果还是不清楚可以再回看源码及流程图消化吸收。
查看全部
举报