事件分发核心 - 从dispatchTouchEvent开始... True if the event was handled by the view, false otherwise....事件分发核心 - 从dispatchTouchEvent开始... True if the event was handled by the view, false otherwise....视图位移调用链 dispatchTouchEvent()→ RefreshContentWrapper.canRefresh() → moveSpinnerInfinitely → moveSpinner...状态切换调用链 dispatchTouchEvent()→ RefreshContentWrapper.canRefresh() → moveSpinnerInfinitely → moveSpinner...视图位移调用链 dispatchTouchEvent()→ RefreshContentWrapper.canRefresh() → moveSpinnerInfinitely → moveSpinner
super.dispatchTouchEvent(ev); } } 这里,我们只是在dispatchTouchEvent 和 onTouchEvent 进行了打印 当我们触摸【a】的时候, 会得到打印...MainActivity ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg EventButton ---- dispatchTouchEvent...Paste_Image.png 我们可以发现 先调用了 Activity的 dispatchTouchEvent 再调用 EventButton 的 dispatchTouchEvent 和...super.dispatchTouchEvent(ev); } } 这里,我们也只是在dispatchTouchEvent 和 onTouchEvent 进行了打印 当我们触摸【b】的时候,...Paste_Image.png 我们可以发现 先调用了 Activity的 dispatchTouchEvent 再调用 EventButton 的 dispatchTouchEvent 和
上节概述 从上节View·dispatchTouchEvent 源码分析(三)中,我们分析了 ACTION_DOWN 事件的派发和拦截过程。 接下去,我们分析后续的事件是怎么被处理的!...此处会涉及到dispatchTouchEvent()方法的继承关系,所以有必要弄清楚mView的继承链。...省略... } 6、首先关注下DecorView、FrameLayout是否覆写dispatchTouchEvent()方法,检查后发现并未覆写。...// (02) 如果child不是空,调用child的dispatchTouchEvent()。...下一章将会分析View在调用dispatchTouchEvent()时会影响哪些方法,并且这些影响的方法如何在实际工作中产生效用。
上节概述 ---- 1、在 Activity 中的事件都会按照先交由 Activity 中处理 dispatchTouchEvent 。...所以真正意义上的 dispatchTouchEvent 的过程即将真正开始。 查看上节文章View·从 InputEvent 到 dispatchTouchEvent 源码分析(二)。...俯瞰 dispatchTouchEvent 方法 ---- 先从整体的角度看下 dispatchTouchEvent 方法,它提供了: 对输入的 MotionEvent 事件的校对; 辅助相关功能; 事件分发...事件派发时 本章总结 1、由 Stage 调用 DecorView.dispatchTouchEvent 2、DecorView 继承 ViewGroup 且未覆写 dispatchTouchEvent...方法,所以交由 ViewGroup的dispatchTouchEvent 进行处理。
requestDisallowInterceptTouchEvent(MotionEvent)方法, 这样,可以放父View的 onInterceptTouchEvent(MotionEvent)失效 (当然,还有其他情况,现在暂时略) ---- dispatchTouchEvent...onInterceptTouchEvent ** public boolean onInterceptTouchEvent(MotionEvent ev) { return false; } 那我们来看看 dispatchTouchEvent...mGroupFlags 和很多方法有关,方法中和很多二进制的变量有关,并且这些二进制码都不太一样, 比较复杂,只能暂时放一下 FLAG_DISALLOW_INTERCEPT 就比较简单点, 只和 dispatchTouchEvent...resetTouchState(), requestDisallowInterceptTouchEvent 这3个方法有关 (先忽略resetTouchState()这个方法,也就是上面说的别的情况, dispatchTouchEvent...boolean值,再如果有 父View,修改父View的 mGroupFlags 值 如果为true,则会执行后面的方法,修改 父View对应的 mGroupFlags 值 ---- 最后,我们回到 上面贴的 dispatchTouchEvent
到对应的View 这个时候,就消费掉了, 不会回传 如果我们点击一个ViewGroup,会dispatchTouchEvent到对应的ViewGroup 这个时候,不会被消费,会回传 那么,会不会有点击一个...----> noMsg EventViewGroup ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg MainActivity...Paste_Image.png 点击 自定义的TouchEventChilds 可以发现对应的过程 MainActivity ---- dispatchTouchEvent ---->...ACTION_DOWN ----> noMsg TouchEventFather ---- dispatchTouchEvent ----> ACTION_DOWN ---->...----> ACTION_DOWN ----> noMsg TouchEventFather ---- dispatchTouchEvent ----> ACTION_DOWN
Paste_Image.png 点击后,我们来看一下对应的打印信息 如果没有滑动 MainActivity ---- dispatchTouchEvent ----> ACTION_DOWN...----> noMsg EventButton ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg EventButton...---- onTouchEvent ----> ACTION_DOWN ----> noMsg MainActivity ---- dispatchTouchEvent...----> ACTION_UP ----> noMsg EventButton ---- dispatchTouchEvent ----> ACTION_UP ---->...----> ACTION_DOWN ----> noMsg EventButton ---- dispatchTouchEvent ----> ACTION_DOWN ---->
(MotionEvent ev) { TouchEventUtil.logActionMsg(getClass(),"dispatchTouchEvent",ev); return...super.dispatchTouchEvent(ev); } } EventViewGroup package com.aohuan.test.dodoevent.view; import...super.dispatchTouchEvent(ev); } } TouchEventFather: package com.aohuan.test.dodoevent.view; import...super.dispatchTouchEvent(ev); // return true; } @Override public boolean onTouchEvent...super.dispatchTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent ev) {
Paste_Image.png ---- 前言 前面用到了 dispatchTouchEvent 和 onTouchEvent 分别表示 分发事件 和 触摸消费的事件 我们可以发现, Activity...(MotionEvent ev) { TouchEventUtil.logActionMsg(getClass(),"dispatchTouchEvent",ev); return...super.dispatchTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent ev) {...Paste_Image.png 点击【2】 MainActivity ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg...Paste_Image.png 点击【3】 MainActivity ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg
cb.dispatchTouchEvent(ev) : super.dispatchTouchEvent(ev); } 当有 cb 对象时即可传递给 cb 对象去处理,否则交给 view 去处理...所以首次的dispatchTouchEvent 事件交给 Activity 去处理。...而 superDispatchTouchEvent 的方法就是 ViewGroup 的 dispatchTouchEvent 方法。...// Activity.java public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() ==.../article/details/12517911 [Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()]:http
上一篇,我们大体理解了分发的过程 理解了在 dispatchTouchEvent 和 onTouchEvent 的过程中 对应的顺序 还有 View 和 ViewGroup 的区别 具体代码可以见https...Paste_Image.png 点击 自定义的EventButton 可以发现对应的过程 MainActivity ---- dispatchTouchEvent ----> ACTION_DOWN...----> noMsg EventButton ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg MainActivity...Paste_Image.png 点击 自定义ViewGroup的 EventViewGroup 后 可以发现 MainActivity ---- dispatchTouchEvent -...---> ACTION_DOWN ----> noMsg EventViewGroup ---- dispatchTouchEvent ----> ACTION_DOWN ----
上一篇,简单叙述了一下对应的想法 这篇也只是选读,没有太多实在意义,只是叙述一下对应的解决过程 这里简单录制gif,好理解一点
方法事件传递机制 2、Activity.onTouchEvent 方法事件传递机制 三、ViewGroup 的事件传递 1、ViewGroup.dispatchTouchEvent 方法事件传递机制...(MotionEvent ev) { return super.dispatchTouchEvent(ev); } @Override public boolean...(MotionEvent event) { return super.dispatchTouchEvent(event); } @Override public...事件来源 : ① 布局容器 ViewGroup 的 dispatchTouchEvent 方法返回 false ; ② 布局容器 ViewGroup 的 onTouchEvent 方法返回 false.../** * 针对 ACTION_DOWN 事件分析 : * 事件来源 : * 本类的 dispatchTouchEvent 方法返回 super.dispatchTouchEvent
( 1955): MainActivity->dispatchTouchEvent ( 1955): MyViewGroup1-->dispatchTouchEvent ( 1955): MyViewGroup1...然后看默认情况下的log: ( 1955): MainActivity->dispatchTouchEvent ( 1955): MyViewGroup1-->dispatchTouchEvent (...过程必然是这样 View.dispatchTouchEvent() 返回 true -> ViewGroup2.dispatchTouchEvent() 返回 true -> ViewGroup1....dispatchTouchEvent() 返回 true -> Activity得到ViewGroup1.dispatchTouchEvent() 返回 true后就是上面分析的源码流程了。...View的dispatchTouchEvent()逻辑。
(MotionEvent ev) { Log.e(TAG,"MainActivity:dispatchTouchEvent"); return super.dispatchTouchEvent...(MotionEvent ev) { Log.e(TAG,"MyViewGroup:dispatchTouchEvent"); return super.dispatchTouchEvent...(MotionEvent event) { Log.e(TAG,"MyView:dispatchTouchEvent"); return super.dispatchTouchEvent...—> MyViewGroup:dispatchTouchEvent —>MyViewGroup : onInterceptTouchEvent—> MyView:dispatchTouchEvent...(MotionEvent event) { Log.e(TAG,"MyView:dispatchTouchEvent"); return super.dispatchTouchEvent
二.触摸事件的传递阶段 1.分发(Dispatch) 在Android系统中所有的触摸事件都是由 dispatchTouchEvent 方法进行分发的。...该方法中判断事件是被消费( return true ),还是继续分发给子视图处理( return super.dispatchTouchEvent ),如果当前视图是ViewGroup或者其子类,则会调用...@Override public boolean dispatchTouchEvent(MotionEvent event) { return super.dispatchTouchEvent(event...、OnTouchEvent ViewGroup: 拥有dispatchTouchEvent 、OnInterceptTouchEvent 、OnTouchEvent View:拥有dispatchTouchEvent...返回父类同名方法,super.dispatchTouchEvent 或者 super.OnTouchEvent。
(event) ViewGroup.dispatchTouchEvent(event) 事件一层层传递到了ViewGroup里。...() ViewGroup.onInterceptTouchEvent() child.dispatchTouchEvent() super.dispatchTouchEvent() View.onTouchEvent...dispatchTouchEvent(MotionEvent event) { if (!...ViewGroup.dispatchTouchEvent(); public boolean dispatchTouchEvent(MotionEvent event) {...() 把事件传给子 View 看有没有 TouchTarget 如果没有,调用⾃己的 super.dispatchTouchEvent() 如果有,调用 child.dispatchTouchEvent
(event); } 在里面调用了父类FrameLayout的dispatchTouchEvent()方法,而FrameLayout中并没有dispatchTouchEvent...()方法 if (child.dispatchTouchEvent(ev)) { // 如果child.dispatchTouchEvent(ev)返回true表示 //该事件被消费了...()方法,LinearLayout也没有dispatchTouchEvent()这个方法,所以也是调用ViewGroup的dispatchTouchEvent()方法,所以这个方法卡在51行没有继续下去...,就是RelativeLayout,FrameLayout的dispatchTouchEvent()继续卡在51行,先执行RelativeLayout的dispatchTouchEvent()方法 执行...的dispatchTouchEvent(), TextView并没有dispatchTouchEvent()这个方法,于是找TextView的父类View,在看View的dispatchTouchEvent
1、ViewGroup - dispatchTouchEvent - ACTION_DOWN 首先是ViewGroup的dispatchTouchEvent方法: @Override public...boolean dispatchTouchEvent(MotionEvent ev) { if (!...36-57行:开始遍历所有的子View 41行:进行判断当前的x,y坐标是否落在子View身上,如果在,47行,执行child.dispatchTouchEvent(ev),就进入了View的dispatchTouchEvent...- dispatchTouchEvent - ACTION_UP public boolean dispatchTouchEvent(MotionEvent ev) { if (!...(ev)返回的为false ; 如果你仔细看了,你会注意到ViewGroup的dispatchTouchEvent(ev)的ACTION_DOWN代码是这样的 if (child.dispatchTouchEvent
---onInterceptTouchEvent---onTouchEvent 点击:ViewGroup1(最外层) I/System.out: MainActivity dispatchTouchEvent...I/System.out: ViewGroup1 dispatchTouchEvent ViewGroup1 onInterceptTouchEvent I/System.out...ViewGroup1 dispatchTouchEvent ViewGroup1 onInterceptTouchEvent ViewGroup2...dispatchTouchEvent ViewGroup1 onInterceptTouchEvent ViewGroup2 dispatchTouchEvent...点击View.png ---- 苹果树上掉下(分发:dispatchTouchEvent false)个苹果(event),爷爷(ViewGroup1)拿到。
领取专属 10元无门槛券
手把手带您无忧上云