图片会说话系列之Android事件的分发传递机制

在一些复杂布局中,经常会遇到事件冲突,事件失效等问题,这就需要我们深入理解Android事件的分发传递机制。最好的方法是自己写一个demo,打印事件相关的日志查看其运行流程,然后再结合源码去深入理解。当然这里不会做这些,这里只有总结性的东西,如果你喜欢这种东西,那么请继续往下看。

老规矩,先上图:

用户的交互一般发生在触摸屏上,因此Android事件的传递必然涉及到ViewGroup和View,ViewGroup与View包含的处理事件传递的方法分别如下:

ViewGroup:

<span style="font-size:14px;">public boolean dispatchTouchEvent(MotionEvent event)
public boolean onTouchEvent(MotionEvent event)
public boolean onInterceptTouchEvent(MotionEvent event)</span>

View:

<span style="font-size:14px;">public boolean dispatchTouchEvent(MotionEvent event)
public boolean onTouchEvent(MotionEvent event) </span>

其中dispatchTouchEvent负责事件分发,onTouchEvent负责事件处理,onInterceptTouchEvent负责事件拦截。可以看到,只有ViewGroup才拥有onInterceptTouchEvent方法。

了解完事件相关的基本方法后,来看一些关键点:

1.Android事件的传递顺序:Activity--->ViewGroup--->View。

2.如果dispatchTouchEvent中返回true,则不再往下继续分发,事件取消;返回false,则继续传递事件。

3.如果ViewGroup的onInterceptTouchEvent返回true,则表示拦截事件,故不再往下传递给View,交给ViewGroup自身处理;如果返回false,则继续传递给View。

4.如果onTouchEvent返回true,则表示其消费掉事件,但不会响应onClickListener;如果返回false,则会继续响应onClickListener,如果有设置过的话。

5.其他的可以参考上图中的具体描述。

时间: 2024-10-23 20:07:50

图片会说话系列之Android事件的分发传递机制的相关文章

图片会说话系列之Android图片缓存框架

前言:看过很多精彩的文章,作者写的非常好,但总觉得文字描述没有图片或图表说明来得直观,因为图片可以化抽象为具体.语言是有区域性的,而图片则是全世界通用的,即使语言不通,却能通过图片了解一切.因此想做一个系列的简博客,内容就是一张图附带一些必要的说明,这样就能迅速抓住重点,而不需要做太多的阅读,便能了解框架性的东西.文章所涉及到的图片有的可能来自官方网站,有的来自名家博客,或者是自己绘制的,都会一一说明. 切入正题,先来第一发,上图: 上图来自:https://github.com/nostra1

Android事件总线分发库EventBus3.0的简单讲解与实践

Android事件总线分发库EventBus的简单讲解与实践 导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅.以及将发送者和接收者解耦.反正能帮助我们快速开发,这个确实是个好东西,其实鸿洋大神已经对源码作了一个较全面的剖析了 Android EventBus源码解析 带你深入理解Ev

Android Activity 和 ViewGroup中事件触发和传递机制

1.在只有Activity的情况: 1)Touch事件触发流程: 首先触发dispatchTouchEvent 然后触发onUserInteraction 再次onTouchEvent 如果是点击的话,紧跟着下列事件(点击分俩步,ACTION_DOWN,ACTION_up) 触发dispatchTouchEvent 再次onTouchEvent 当ACTION_up事件时不会触发onUserInteraction(可查看源代码) 2)键盘事件触发流程 首先触发dispatchKeyEvent 然

Android事件的分发机制

在分析Android事件分发机制前,明确android的两大基础控件类型:View和ViewGroup.View即普通的控件,没有子布局的,如Button.TextView. ViewGroup继承自View,表示可以有子控件,如Linearlayout.Listview这些.今天我们先来了解View的事件分发机制. 先看下代码,非常简单,只有一个Button,分别给它注册了OnClick和OnTouch的点击事件. 1 btn.setOnClickListener(new View.OnCli

45、Android事件总线分发库的使用

事件总线分发库EventBus和Otto的简介及对比 什么是事件总线管理: a.将事件放到队列里,用于管理和分发b.保证应用的各个部分之间高效的通信及数据.事件分发c.模块间解耦 Event Bus是一个发布 / 订阅的事件总线.Event Bus模式 — 也被称为Message Bus或者发布者/订阅者(publisher/subscriber)模式 — 可以让两个组件相互通信,但是他们之间并不相互知晓. 基于事件总线管理/订阅/分发模式的.事件响应有更多的线程选择,EventBus可以向不同

Android事件的分发、拦截和执行

在平常的开发中,我们经常会遇到点击,滑动之类的事件.有时候不同的view之间也存在各种滑动冲突.比如布局的内外两层都能滑动的话,那么就会出现冲突了.这个时候我们就需要了解Android的事件分发机制. 介绍 Android的触摸事件分发过程由三个很重要的方法来共同完成:dispatchTouchEvent.onInterceptTouchEvent.onTouchEvent.我先将这三个方法大体的介绍一下. public boolean dispatchTouchEvent(MotionEven

[学习总结]4、Android的ViewGroup中事件的传递机制(一)

本文主要针对dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent三个方法,通过简单的例子来简单的介绍下. 根据字面意思的理解,dispatchTouchEvent分发触摸事件,onInterceptTouchEvent拦截触摸事件,onTouchEvent触摸事件.正如它们各自的字面意思,下面简单的列出各自的作用和用法. 1.dispatchTouchEvent作用:决定事件是否由onInterceptTouchEvent来拦截处理. 返回s

一步步理解Android事件分发机制

回想一下,通常在Android开发中,我们最常接触到的是什么东西?显然除了Activity以外,就是各种形形色色的控件(即View)了. 与此同时,一个App诞生的起因,终究是根据不同需求完成与用户的各种交互.而所谓的交互,本质就是友好的响应用户的各种操作行为. 所以说,有很多时候,一个控件(View)出现在屏幕当中,通常不会是仅仅为了摆设,而是还要能够负责响应用户的操作. 以最基本的例子而言:现在某一个界面中有一个按钮(Button),而每当用户点击了该按钮,我们的程序将做出一定回应. 那么,

Android焦点事件分发与传递机制

如果您对TouchEvent事件分发机制不太了解的,可以参考我的这篇文章--安卓TounchEvent事件分发机制. 问题:TV端焦点满天飞,如何解决和处理? 记得初入TV开发,以为很简单.TV的这些界面与布局太简单了,分分钟就可以把页面搭建出来,处理好,然后就没有然后了.... 下面我们就从源码来带大家进行安卓TV焦点事件的传递 这里先给出Android系统View的绘制流程: 依次执行View类里面的如下三个方法: measure(int ,int) :测量View的大小 layout(in