首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Carson带你学Android:手把手带你深入分析事件分发机制!

后是有返回值 // 若该控件可点击,那么点击dispatchTouchEvent返回值必定是true,因此会导致条件判断成立 //...(),对于抬起View事件,在调用performClick(),因为设置了点击事件,所以会回调onClick()。...()、onTouchEvent()、onInterceptTouchEvent())进行重写 更改返回值 那么调用是这3个方法默认实现:调用下层方法 & 逐层返回 事件传递情况:(呈U型)...等) 当dispatchTouchEvent()事件分发,只有前一个事件(如ACTION_DOWN)返回true,才会收到后一个事件ACTION_MOVE和ACTION_UP) 即如果在执行ACTION_DOWN...返回false,后面一系列ACTION_MOVE、ACTION_UP事件都不会执行 从上面对事件分发机制分析知: dispatchTouchEvent()、 onTouchEvent() 消费事件

76410

Android高级进阶之路【二】十分钟彻底弄明白 View 事件分发机制

后是有返回值 // 若该控件可点击,那么点击dispatchTouchEvent返回值必定是true,因此会导致条件判断成立 //...(),对于抬起View事件,在调用performClick(),因为设置了点击事件,所以会回调onClick()。...()、onTouchEvent()、onInterceptTouchEvent())进行重写 更改返回值 那么调用是这3个方法默认实现:调用下层方法 & 逐层返回 事件传递情况:(呈U型) 从上往下调用...等) 当dispatchTouchEvent()事件分发,只有前一个事件(如ACTION_DOWN)返回true,才会收到后一个事件ACTION_MOVE和ACTION_UP) 即如果在执行ACTION_DOWN...返回false,后面一系列ACTION_MOVE、ACTION_UP事件都不会执行 从上面对事件分发机制分析知: dispatchTouchEvent()、 onTouchEvent() 消费事件

60930
您找到你想要的搜索结果了吗?
是的
没有找到

手把手教你读懂源码,ViewTouch事件传递流程详细剖析

ActivityonTouchEvent 方法,同时ActivitydispatchTouchEvent方法返回true; 反之返回false,这个事件就交给ActivityonTouchEvent...(ev)返回false,ActivitydispatchTouchEvent方法默认返回false。...dispatchTouchEvent方法片段2 变量intercepted用来标记是否拦截该Touch事件true表示拦截,false表示不拦截。...这里需要注意是,如果intercepted为true,也就是ACTION_MOVE和ACTION_UP事件被拦截了,则cancelChild为true,则会分发一次ACTION_CANCLE事件。...从返回值可以看到,如果重写OnTouch方法返回true的话,那么result值就为true,意味着该事件被消费掉了,就不会继续执行后面的onTouchEvent方法了;否则继续执行onTouchEvent

73870

Android触摸事件传递(上)

这里分三步,第一步,如果是触摸开始类型ACTION_DOWN事件,会回调onUserInteraction()方法,所以在项目中可以考虑将一些需要用户开始触摸就执行代码放到此方法中;第二步,将触摸事件...事件,然后是几个ACTION_MOVE事件,最后是ACTION_UP事件。...接下来,我们给EventBtn添加onTouchListener,并返回true ?    运行App,查看打印日志, ?    ...下面我们将onTouchListener返回值改为false,并重写EventBtn onTouchEvent方法,并返回true。 ?    运行App,点击按钮,查看打印日志, ?    ...看到源码,很一目了然,框架先调用onTouchListener,如果事件没有被消费掉,再调用onTouchEvent,最后result表示此触摸事件是否被消费,作为返回值

1.1K30

Android触摸事件传递(下)

ViewGroup触摸事件传递,我们先了解onInterceptTouchEvent()方法,这个方法默认返回false,表示ViewGroup是否拦截触摸事件,即如果返回true,拦截触摸事件,则不会将任何触摸事件...可以看到,我们button没有接收到触摸事件,现在将onInterceptTouchEvent返回值改为false,再次运行App,点击按钮,查看打印日志, ?    ...很明显,我们按钮触摸事件和它父容器触摸事件,都触发了,这是因为,我们EventBtnonTouchListener方法和onTouchEvent方法都返回false,没有消费触摸事件事件会向上继续传递...那么如果ViewGroup不拦截触摸事件事件在它子Views中又是如何传递呢?    ...同样,我们可以利用代码来验证我们上面的结论,我们打开EventBtn类中dispatchTouchEvent方法中日志打印代码,同时我们将btn3onTouchListener方法返回true,消费掉触摸事件

1K10

View,ViewGroupTouch事件分发机制

//ACTION_UP才会走到这里, 假如在ACTION_MOVE或者ACTION_UP拦截 //Touch事件, 将ACTION_CANCEL派发给target,然后直接返回true...上面的ViewGroupTouch事件分发就告一段落先,因为这里调用TextView(也就是View)dispatchTouchEvent()方法,所以我们先分析ViewdispatchTouchEvent...接口onTouch()方法返回值了,如果调用了setTouchListener()设置OnTouchListener,并且onTouch()方法返回true,ViewdispatchTouchEvent...我觉得OnTouchListener接口是对处理Touch事件屏蔽和扩展作用吧,屏蔽作用我就不举例介绍了,看上面的源码就知道了,我就说下扩展吧,比如我们打印ViewTouch坐标,我们可以自定义一个...重写了onTouchEvent(),所以这里还是调用CustomLayoutonTouchEvent(), 这个方法返回false, 不消费Touch事件,所以不会在触发ACTION_MOVE,ACTION_UP

1.1K70

Android 事件分发机制

用来进行事件分发和传递,返回true时候一定是自己去消费,返回false有可能是自己消费也有可能是传递给上一级OnTouchEvent方法, super就传递给其他view。...1.6 onClick 是一个点击事件,是在onTouchEventup事件里面执行,它优先级是最低,如果在onTouchEventOnTouchListeneronTouch方法如果返回true...箭头上值表示该方法返回值,消费框表示事件被消费掉,不会向下或者向上传递,接下来我们写代码运行一下看效果。...点击事件响应怎么办,按照上面的andorid事件分发流程图,方法多了,我们可以在不同阶段进行控制,不让事件向下分发,但我们试试onTouch()这个方法,此方法默认返回false,我们现在让它返回true...先让系统以为viewonTouchEvent消费事件:在viewonTouchEvent中return true,结果如下: ?

1.5K21

Art of Android Development Reading Notes 3

返回值True事件会传递到自己onTouchEvent(); 若返回值False传递到子viewdispatchTouchEvent()。...若返回值True事件由自己处理,后续事件序列让其处理; 若返回值False,自己不消耗事件,向上返回让其他父容器onTouchEvent接受处理。...优先级onTouchEvent要高 如果给一个view设置了OnTouchListener,那么OnTouchListeneronTouch方法会被回调。...这时事件如何处理还要看onTouch返回值,如果返回false,那么当前viewonTouchEvent方法会被调用;如果返回true,那么onTouchEvent方法将不会被调用。...事件除外,即当面对ACTION_DOWN事件,ViewGroup总是会调用自己onInterceptTouchEvent方法来询问自己是否拦截事件

42110

Android触摸事件传递机制

ACTION_MOVE:在按下情况下,进行移动。轻微移动都会传递到该事件。...该方法中判断事件是被消费( return true ),还是继续分发给子视图处理( return super.dispatchTouchEvent ),如果当前视图是ViewGroup或者其子类,则会调用...OnTouchEvent 方法判断,是被消费( return true ),还是不处理( return false )并将事件传递给父视图 OnTouchEvent 方法进行处理。...由于拥有不同返回值,所以事件传递流程也有不同,经过不断修改返回值测试,最终得到了点击事件流程图,ACTION_DOWN 和 ACTION_UP 事件传递流程是相同。...),到达最内层 View ,将由 View OnTouchEvent 方法处理,该方法返回 true 进行消费不再传递,返回 false 再由内向外传递,由外层 OnTouchEvent

1.1K10

一文读懂Android View事件分发机制

上面代码我们给button设置了OnTouchListener并重写了onTouch方法,方法返回值默认为false。如果这里我们返回true,那么你会发现onclick方法不执行了!!!What?...我们重点需要了解这个分发过程,那么系统是如何去判断这个事件要给哪个View,也就是说是如何进行分发呢?...特别注意,这是ViewGroup特有的方法,View并没有拦截方法 返回值:是否拦截事件传递,返回true表示拦截了事件,那么事件将不再向下分发而是调用View本身onTouchEvent方法。...返回值:返回true表示事件被消费,本次事件终止。返回false表示事件没有被消费,将调用父ViewonTouchEvent方法 上面的三个方法可以用以下伪代码来表示其之间关系。 ?...当没有设置OnTouchListener或者设置了OnTouchListener但是onTouch方法返回false则会调用View自己onTouchEvent方法。

31620

重新复习Android View事件分发

ContentView中 触摸事件类型 触摸事件对应是MotionEvent类,事件类型主要有如下三种: ACTION_DOWN ACTION_MOVE(移动距离超过一定阈值会被判定为ACTION_MOVE...拦截(onInterceptTouchEvent):方法返回值true表示拦截这个事件并交由自身onTouchEvent方法进行消费;返回false表示不拦截,需要继续传递给子视图。...消费(onTouchEvent):方法返回值true表示当前视图可以处理对应事件返回值false表示当前视图不处理这个事件,它会被传递给父视图onTouchEvent方法进行处理。...因为一旦一个元素拦截了此事件,那么同一个事件序列内所有事件都会直接交给它处理(即不会再调用这个View拦截方法去询问它是否拦截了,而是把剩余ACTION_MOVE、ACTION_DOWN等事件直接交给它来处理...ViewlongClickable属性默认都为false,clickable属性分情况,比如Buttonclickable属性默认为true,而TextViewclickable默认为false

32520

笔记(四)——事件分发机制

image 一个事件是指:一个ACTION_DOWN事件ACTION_MOVE事件ACTION_UP事件等。它们合称同一个事件序列。...(4)、onInterceptTouchEvent拦截方法,类似一个开关,当return true事件则被当前控件消费了,拦截该事件,不再往下传递了;而return falsereturn super.xxxxxx...down事件流程2 重要注意: (1)、如果一个ViewViewGrouponTouchEvent不消耗ACTION_DOWN事件返回了false,那么它就不会再接收同一事件序列中ACTION_MOVE...ViewlongClickable属性默认都为false,clickable属性分情况,比如Buttonclickable属性默认为true,而TextViewclickable属性默认为false...ACTION_UP事件,这里必须要返回false,假设事件交由子元素处理,如果父容器在ACTION_UP返回了true,就会导致子元素无法接收到ACTION_UP事件,这个时候子元素中onClick

86530

笔记——事件分发机制(四)

3.因此总结,在onTouchEvent()中MotionEvent.ACTION_DOWN返回值处理是关键;当它返回return true无论后面如何处理,它都是已经处理消费了事件,不会再往上向父容器传递事件...这条也很好理解,就是说当一个View决定拦截一个事件后,那么系统会把同一个事件序列内其他方法都直接交给它来处理,因此就不用再调用这个ViewonInterceptTouchEvent去询问它是否拦截了...ViewlongClickable属性默认都为false,clickable属性分情况,比如Buttonclickable属性默认为true,而TextViewclickable属性默认为false...ACTION_UP事件,这里必须要返回false,假设事件交由子元素处理,如果父容器在ACTION_UP返回了true,就会导致子元素无法接收到ACTION_UP事件,这个时候子元素中onClick...方法在ACTION_UP返回了false

73040

事件分发工作流程

onInterceptTouchEvent 该方法只存在于viewGroup中,当一个事件需要被分发到子view,viewGroup会调用此方法检查是否进行拦截。...因此下面的工作流程中都是指down事件分发 ,而不是ACTION_MOVEACTION_UP分发。...view会先检查是否有onTouchListener返回值是否为true,如果是true则直接返回,否则调用onTouchEvent方法来处理事件。 基于上述关系,可以得到下面的工作流程图: ?...那么当viewGroup掐断事件流之后,事件走向又是如何呢?参看下图:(注意,这里不讨论多指操作情况,仅讨论单指操作moveup事件被viewGroup拦截情况) ?...消费原则,如果一个view消耗了down事件却在接下来moveup事件返回了false,那么此事件不会给上层viewGroup处理,而是直接返回false

70210

android 触摸屏事件_android studio按钮点击事件

一个Action_DOWN, n个ACTION_MOVE, 1个ACTION_UP,就构成了Android中众多事件。...对于ViewGroup类控件,有一个很重要方法,就是onInterceptTouchEvent(),用于处理事件并改变事件传递方向,它返回值是一个布尔值,决定了Touch事件是否要向它包含子View...而方法onTouchEvent(),用于接收事件并处理,它返回值也是一个布尔值,决定了事件及后续事件是否继续向上传递,这个方法是从子View向父View传递。...返回值true表示事件被正确接收和处理了,返回值false表示事件没有被处理,将继续传递下去。...如果某ViewonTouchEvent返回了false,则DOWN事件继续向其父ViewGroup类onTouchEvent传递;如果返回了true,则后续事件会直接传递给其onTouchEvent

2K30

Touch事件实现View拖动

注意: onTouch和onClick事件冲突问题:   当同时实现了Touch和Click事件,会发生冲突,如何避免?在我们onTouchListener监听方法会返回一个boolean。...当它为false,就会触发Click事件,当它为true,便不会触发。我们希望在点击时候触发点击事件,在拖动时候实现移动效果Touch事件。   ...那么,我们定义一个boolean key=false;在ACTION_DOWN里,使key=false。而在ACTION_MOVE中使key=true,最后返回key即可。...这样做会出现很难触发点击事件。拖动事件太容易触发。所以我们需要加点限制。在ACTION_MOVE中我们获得X、Y移动距离。那么我们判断当期中一个移动距离大于1,才执行key=true。...不过需要在UI控件全部加载完成之后才能调用,不能在onCreate()甚至onResum()中调用,否则全是0。正确姿势是在touch时间或者click事件触发时候调用

1.5K10

结合源码,重温 Android View 事件处理知多少 ?

操作 经过上面分析,我们可以知道: onTouch 事件必须返回 true ,才会执行该方法块。...我们发现 setOnTouchListener onTouch 默认返回值false( 不满足返回值true ), 这就表明他会继续去执行下一个代码块: if (!...result && onTouchEvent(event)) { result = true; } 执行这个 if 语句过程中。首先调用了 onTouchEvent 方法。...; } }); 接着,我们发现 OnLongClick 是有返回值,如果返回值false 还会接着去触发 onClick 事件,如果返回 true 的话,那么这个长按事件就直接被消费掉了(...2.4 总结 100mm 为点击,500mm 为长按,接着触发长按事件。 再看长按事件返回值,如果 true 就结束。

30840

Android面试老生常谈 View 事件分发机制,看这一篇就够了!

这个方法能够影响父View是否拦截事件true 表示父 View 不拦截事件false 表示父 View 拦截事件 我们先来看一张图。...仔细看的话,图分为3层,从上往下依次是Activity、ViewGroup、View 事件从左上角那个白色箭头开始,由 Activity dispatchTouchEvent 进行分发 箭头上面字代表方法返回值...,(return true、return false、return super.xxxxx(),super 意思是调用父类实现。)...如果dispatchTouchEvent返回 false ,则回传给父ViewonTouchEvent事件处理; 如果dispatchTouchEvent返回super的话,默认会调用自己onInterceptTouchEvent...父 View不要拦截事件,这样保证子 View 能够接受到 Action_move 事件,再在 Action_move 动作中根据自己逻辑是否拦截事件,不需要拦截事件的话再交给 父 View 处理

61920

View 事件分发机制,看这一篇就够了

这个方法能够影响父View是否拦截事件true 表示父 View 不拦截事件false 表示父 View 拦截事件 我们先来看一张图。...箭头上面字代表方法返回值,(return true、return false、return super.xxxxx(),super 意思是调用父类实现。)...目前所有的图事件是针对ACTION_DOWN,对于ACTION_MOVE和ACTION_UP我们最后做分析。...如果dispatchTouchEvent返回 false ,则回传给父ViewonTouchEvent事件处理; 如果dispatchTouchEvent返回super的话,默认会调用自己onInterceptTouchEvent...父 View不要拦截事件,这样保证子 View 能够接受到 Action_move 事件,再在 Action_move 动作中根据自己逻辑是否拦截事件,不需要拦截事件的话再交给 父 View 处理

66340
领券