`

ViewGroup&View&Activity onInterceptTouchEvent&dispatchTouchEvent&onTouch整理

阅读更多
一直对这块的知识一知半解,今天找个时间好好理一理。

首先,我们都知道,三个重写的方法
onInterceptTouchEvent&dispatchTouchEvent&onTouch


都会有返回值。布尔型的,我们可以这样理解

true 表示已消费这个event事件,不会往后传递了。

false 表示没有消费该事件,继续向后传递。

如果各层事件都没有被消费,传递顺序大致是这样的



viewgroup dispatchTouchEvent  -->  viewgroup onInterceptTouchEvent  --> textview onTouch -->  viewgroup onTouch

我这边只用两层,一个viewgroup,一个普通的textview,
(如果层级多也是一样,
   onInterceptTouchEvent   由最底层viewgroup 往上 逐层拦截,
   ontouch                 由最上层子view 向下 逐层传递)


如果在viewgroup 某一个事件在onInterceptTouchEvent被消费了,
那后续的事件也不会再传递到onInterceptTouchEvent了。
更不会到子view的ontouch里去。只会到viewgroup这层的ontouch方法里去
如图



如果onInterceptTouchEvent在ACTION_DOWN 的时候没做拦截,在ACTION_UP的时候做拦截
而子view在ACTION_DOWN的时候消费了事件,按流程后续的事件都应该传递到子view这边
,但因为
ACTION_UP事件被viewgroup拦截,所以子view会默认走ACTION_CANCEL这里。当然因为子view在ACTION_DOWN的时候消费了事件,所以viewgroup的ontouch是不会走到的了。
日志如下:


另外写文章的时候遇到一个问题,
viewgroup 的 onInterceptTouchEvent 以及 子view的 onTouch 都返回false,
那么只会走ACTION_DOWN,而ACTION_UP都不会走,按理说应该走。
因为正常点击或者位移事件都是ACTION_DOWN,ACTION_UP,ACTION_MOVE的,既然都不拦截,那后续的事件应该都走完?
网上有人解答说



看的云里雾里的,但这么做的确行得通。不知有哪位大神能通俗的给小弟解释下~


参考http://my.oschina.net/fengheju/blog/196608?_t=t
http://bbs.csdn.net/topics/380019043


  • 大小: 7.9 KB
  • 大小: 5.5 KB
  • 大小: 13.5 KB
  • 大小: 62.3 KB
0
0
分享到:
评论

相关推荐

    Android view面试专题.pdf

    - ViewGroup的`dispatchTouchEvent`调用`onInterceptTouchEvent`判断是否拦截事件。 - 如果不拦截,事件会遍历子View,执行子View的`dispatchTouchEvent`,如果设置了`onTouchListener`,则执行`onTouch`方法。 -...

    android面试题目整理

    2. 一旦一个ViewGroup决定拦截事件(`onInterceptTouchEvent`返回true),后续的事件序列将不再传递给该ViewGroup的子View,事件在此处停止向下传递。 理解并熟练运用事件分发机制对Android开发者至关重要,因为它...

    全面的Android view相关知识汇总整理

    - `onInterceptTouchEvent()`在ViewGroup中判断是否拦截事件。 - 如果不拦截,事件会传递给子View的`dispatchTouchEvent()`,执行`onTouchEvent()`。 - `onTouch()`方法决定是否处理事件,若返回false,则继续...

    Android从源码的角度彻底理解事件分发机制的解析(上)

    当事件发生时,系统首先调用顶级View(通常是Activity的DecorView)的`dispatchTouchEvent()`,然后逐级向下分发。 2. `onTouchEvent(MotionEvent event)`:这个方法用于处理具体触摸事件,如点击、滑动等。当一个...

    android面试

    - 如果`onInterceptTouchEvent`返回`false`,则事件将继续传递给当前ViewGroup的子View。 - 如果子View是另一个ViewGroup,则重复上述过程;如果是普通的View,则进入View层面的处理。 - **View层面**: - 当事件...

    android面试题集锦(珍藏)

    - **未消费DOWN事件**: 如果除了`Activity`外的任何`View`均未消费DOWN事件,则事件将不再传递给`Activity`内的子`View`,而直接由`Activity`处理。 - **ViewGroup拦截事件**: 一旦`ViewGroup`决定拦截事件,后续...

    view面试专题.docx

    - 根ViewGroup执行`onInterceptTouchEvent`方法判断是否拦截事件。 - 如果不拦截,则遍历子View,将事件传递给子View的`dispatchTouchEvent`方法。 - 若子View设置了`OnTouchListener`,则执行`onTouch`方法,并...

    Android事件的分发机制详解

    在分发过程中,`dispatchTouchEvent()` 负责将事件传给子View,`onInterceptTouchEvent()` 允许 ViewGroup 在事件到达具体子View之前拦截事件,而 `onTouchEvent()` 是处理实际的触摸事件。 在上述示例代码中,一个...

    Android事件分发机制的PPT总结

    在视图(View)层面,dispatchTouchEvent()方法首先将事件发送给其监听器(如果存在的话),然后由View.OnTouchListener的onTouch()方法来决定是否消费此事件。如果事件没有被消费,那么系统就会调用View自身的...

    Android深入研究Touch事件demo

    在Android开发中,触摸事件(Touch Event)是用户与设备交互的重要部分,它涉及到Activity、View及ViewGroup之间复杂的事件分发机制。本篇将深入探讨Android中的触摸事件处理,包括事件的产生、分发、拦截以及如何...

    L11-触摸反馈基础-讲义.pdf

    4. 子View的`dispatchTouchEvent()`接着被调用,如果设置了`OnTouchListener`,则调用`OnTouchListener.onTouch()`。 5. 如果`OnTouchListener`没有消费事件,`onTouchEvent()`会被调用,其结果将决定事件是否被消费...

    完全理解android事件分发机制

    **dispatchTouchEvent():**这个是View的事件分发函数,在ViewGroup中进行重写。在View中其间会调用onTouchEvent(),在ViewGroup中其间会调用onInterceptTouchEvent()和onTouchEvent()。 **...

    Android 事件分发机制 讲解

    3. `onTouchListener()`:这个接口的`onTouch()`方法可以在View或ViewGroup上设置监听器,用于处理触摸事件。如果返回true,表示该事件已被处理,不再向下传递。 4. `onTouchEvent()`:这是每个View都有的方法,用于...

    Android 点击事件demo

    为解决这个问题,可以利用`ViewGroup`的`setClickable(true)`和`setFocusable(true)`方法,或者使用`ViewGroup`的`onInterceptTouchEvent(MotionEvent event)`方法拦截事件。 5. **事件分发链**: 事件分发链包括`...

    Android事件机制测试项目

    当事件发生时,Android会按照View-ViewGroup-Activity的顺序依次调用dispatchTouchEvent()、onTouchEvent()、onInterceptTouchEvent()来决定事件的处理。默认情况下,事件会从顶级View组开始向下分发,如果某个View...

    Android Touch事件分发过程详解

    事件分发过程主要涉及三个层次:Activity、ViewGroup和View。 1. **Activity的dispatchTouchEvent()**: 当触摸事件发生时,系统首先调用Activity的`dispatchTouchEvent(MotionEvent ev)`方法。在这个阶段,...

    掌握android Touch 系统

    当事件发生时,首先是Activity的dispatchTouchEvent()方法被调用。这个方法是触摸事件的入口,它会将事件传递给附加到窗口的根视图。如果没有任何视图消费这个事件(即没有处理),那么触摸事件最后会到达Activity的...

    Android View的事件分发详解

    - `dispatchTouchEvent(MotionEvent ev)`:这是事件分发的起点,它会根据事件类型调用`onInterceptTouchEvent`或直接将事件传递给子View。 - `onInterceptTouchEvent(MotionEvent ev)`:父View可以通过重写此方法来...

Global site tag (gtag.js) - Google Analytics