`

View的事件分发机制

 
阅读更多

【分享】
从某处看到的一个关于View的事件分发机制的伪代码,觉得很不错,故此分享,不是原创。

public boolean dispatchTouchEvent(MotionEvent ev){
    boolean consume=false;
    if(onInterceptTouchEvent(ev)){
        consume=onTouchEvent(ev);
    }else{
        consume=child.dispatchTouchEvent(ev);
    }
    return consume;
}

这是伪代码,就是为了方便理解而写的,不是源代码。

解释

通过上面的伪代码,我们大概了解到了点击事件的分发机制:

对于一个根ViewGroup来说,点击事件发生后,首先会传递给它,这时它的dispatchTouchEvent就会被调用,如果这个ViewGroup的onInterceptTouchEvent方法返回true就表示它要拦截当前事件,接着事件就会交给这个ViewGroup处理,即它的onTouchEvent方法就会被调用;如果这个ViewGroup的onInterceptTouchEvent方法返回false,就表示它不拦截当前事件,这时事件就会继续向下传递给它的子元素,接着子元素的dispatchTouchEvent方法就会被调用,如此反复直到事件被最终处理。当然如果所有View都不处理,这个事件最终会传递给当前的Activity处理。

Tips

  1. 这里说View,有时候也指ViewGroup,因为ViewGroup也是继承自View,当然我并不愿意这样,毕竟java类的爸爸都是object,总不能都叫object吧,那不就没了区分,下面的小窍门我会分开说,不会都叫View。
  2. onInterceptTouchEvent这个方法在View、Activity里都没有,在ViewGroup里有,View没有这个方法,也就是说,一旦有事件传给它,那么它的onTouchEvent就会被调用,Activity呢,在源码中是先交给Activity所附属的Window往下分发,有人要,即返回true的话,整个事件循环就结束了,但都没人要,即返回false的话,那么Activity的onTouchEvent就会被调用。
  3. 总的事件传递规则,Activity->Window->View,但如果都不处理,就会原路返回,最后交给Activity处理。
  4. 事件传递过程是由外向内的,我喜欢说成由上向下的,即事件总是传递给父元素,然后再由父元素分发传递给子View,但通过requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的事件分发过程,但是ACTION_DOWN事件除外。
  5. ViewGroup默认是不拦截任何事件的,在源码中ViewGroup的onInterceptTouchEvent返回了false。但是,记住我上面说的话,分开讲,ViewGroup是ViewGroup,但继承ViewGroup的扩展,其onInterceptTouchEvent就不一定返回false。
  6. 当一个View需要处理事件时,如果它设置了OnTouchListener,那么OnTouchListener中的onTouch方法会被调用,这时事件如何处理,还要看onTouch的返回值,如果返回了false,则当前View的onTouchEvent会被调用;如果返回了true,那么onTouchEvent方法将不会调用。简单一句,OnTouchListener的优先级比较高,但这也是可以理解的。
  7. 那接着6,在谈谈OnClickListener吧,如果设置了OnClickListener,其onClick方法也会调用,但不会影响到View onTouchEvent方法的调用,即OnClickListener处在事件传递的尾端,优先级最低,可以理解的,因为如果设置了OnClickListener,View的onTouchEvent方法就不调用了,也不怎么现实啊,事件都没处理,就知道是点击了?

感谢大家的阅读,如有不理解的地方,欢迎在下方评论,也欢迎大家的收藏,这不是我的原创,算是我的分享,我的总结,希望能帮助到大家。

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    谈谈对Android View事件分发机制的理解

    在Android开发中,View事件分发机制是理解用户交互与响应的关键部分。本文将深入探讨这一主题,以解决文中遇到的问题:LinearLayout中的TextView和Button点击事件处理不一致。首先,我们要明白Android事件分发机制...

    view的事件分发机制demo2

    在"view的事件分发机制demo2"中,可能包含了对事件分发机制的实例演示,如自定义ViewGroup和View的实现,以及如何通过重写上述三个方法来控制事件流向。开发者可以通过调试这些方法,观察打印的日志,理解事件在View...

    Android View 事件分发机制详解

    Android View 事件分发机制是Android用户界面交互的基础,它决定了触摸事件如何在视图层次结构中传递和处理。在Android开发中,理解和掌握这一机制至关重要,因为它涉及到UI的响应性和用户体验。 首先,事件分发...

    Android View事件分发处理机制Demo

    总的来说,Android的View事件分发机制是一个深度话题,涉及多个组件和方法的协同工作。通过"TestEventFlow"这样的实践项目,开发者能够更直观地理解事件如何在View层次结构中流动,从而更好地设计和优化用户界面的...

    android View事件分发机制实验代码

    本源码结合博客地址: https://blog.csdn.net/gaoxiaoweiandy/article/details/89840433 讲述了View的事件分发机制以及如何阅读与分析源码。

    View的事件分发测试例子

    在Android开发中,View和ViewGroup是构建用户界面的基本元素,它们之间的事件分发机制是理解和优化用户交互的关键。本文将深入探讨`View`和`ViewGroup`的事件分发流程,以及`onTouchEvent()`方法在其中的角色。通过...

    Android自定义View的事件分发机制(一)

    在博客文章“Android自定义View的事件分发机制(一)”中,作者jsonnan详细阐述了这些概念,并可能通过实例代码展示了如何在自定义View中实现自定义的事件分发逻辑。通过阅读这篇文章,开发者可以更深入地理解...

    view事件分发测试demo

    在Android开发中,View事件分发机制是理解用户交互与应用响应之间关系的关键部分。"view事件分发测试demo"通常是为了帮助开发者深入理解这一机制,通过实践来探索和调试事件处理流程。在这个Demo中,我们很可能会...

    Android事件分发机制全解析Demo

    在Android开发中,事件分发机制是至关重要的一个部分,它决定了用户与界面交互时,事件如何在不同的组件之间传递和处理。本文将基于“Android事件分发机制全解析Demo”进行深入探讨,并通过实际的代码示例来帮助你更...

    事件分发机制

    事件,通常指的是用户的触摸操作,如点击、滑动等,这些操作如何被准确地传递到相应的View上进行处理,就是事件分发机制的核心内容。下面我们将深入探讨这个主题。 首先,Android的事件分发机制主要包括三个步骤:`...

    android事件分发机制Demo

    在Android开发中,事件分发机制是理解和优化用户交互界面不可或缺的部分。...通过实践`android事件分发机制Demo`,你可以直观地看到事件如何在View和ViewGroup之间传递,从而加深对这一机制的理解。

    Android事件分发机制

    在Android系统中,事件分发机制是用户与应用程序交互的核心环节。它决定了用户在屏幕上点击、滑动等操作如何被正确地处理和响应。本文将深入探讨Android事件分发机制,帮助开发者理解这一关键概念。 首先,我们从...

    Android事件分发机制总结Demo

    事件分发机制主要涉及三个关键组件:View、ViewGroup(布局)和MotionEvent。当用户触摸屏幕时,系统会生成一个MotionEvent对象,然后通过事件分发链来决定哪个View处理这个事件。 1. **事件序列**:事件分发分为按...

    安卓事件分发机制的回答

    在Android系统中,事件分发机制是用户界面交互的核心部分,它确保了用户与屏幕上的各种View进行交互时,事件能够正确地传递和处理。本文将深入探讨Android事件分发机制,特别关注在View层次中的事件处理流程。 首先...

    Android 事件分发机制视频讲解

    ### Android 事件分发机制详解 #### 一、引言 在Android开发中,事件处理是用户界面交互设计的核心组成部分。对于开发者来说,理解事件如何被分发到各个控件中至关重要,因为这直接影响到应用的用户体验。本文将从...

    Android View事件分发机制详解

    ion of this abstract class is `...总的来说,Android事件分发机制是UI交互的基础,理解它可以帮助我们创建更高效、更符合用户预期的界面。在开发过程中,可以通过调试和日志来跟踪事件的传递路径,以优化交互逻辑。

    Android事件分发机制小Demo

    在Android开发中,事件分发机制是至关重要的一个部分,它决定了用户与界面元素交互时的行为。本小Demo主要展示了Android事件分发的过程,并通过一系列的日志截图来帮助理解这一机制。下面,我们将深入探讨Android...

    android事件分发机制

    ### Android事件分发机制详解 #### 一、触摸事件涉及的核心类 在Android系统中,触摸事件主要由两类核心对象负责处理:`ViewGroup` 和 `View`。 1. **ViewGroup**:作为容器,继承自 `View`,用于容纳多个 `View`...

Global site tag (gtag.js) - Google Analytics