Android事件传递

简介:

wKiom1NPapfjW9obAAJTEMmddQc567.jpg


更多请关注 MemoMind


事件经过主要的三层,分别是Activity、Layout(多个)、View


三者都拥有dispatchTouchEvent和onTouchEvent方法。

dispatchTouchEvent是用来控制事件分发的(隧道方式传递)。从源码的角度看,其逻辑控制等起主导作用;从使用角度看,在diapatchTouchEvent中用逻辑判断、设置Event的action是个好的方法,而改变其return值会让事件丢失。

onTouchEvent是用来处理、消费事件的。return true标志着事件已被消费;return false标志着事件未被消费,往Layout/Activity方向传递。


Layout除了拥有这两个方法,还独有onInterceptTouchEvent方法。

onInterceptTouchEvent是在事件由Layout分发到View之前的一个拦截机制。因为只通过Layout的dispatchTouchEvent操控只能让事件丢失

如果onInterceptTouchEvent return true,表明拦截事件,事件就不会继续分发而是跳到Layout的onTouchEvent方法中去处理;return false则事件继续分发。


在众多分析事件机制的文章中,很难看到与onTouch、onClick关联起来的解释。开始时我也拿捏不好onTouch和onTouchEvent的关系。

事实上,onTouch是在onTouchEvent之前执行的。如果onTouch return true,表示事件已经被消费,不会调用onTouchEvent了。

而onClick呢,则是在onTouchEvent的ACTION_DOWN和ACTION_UP都执行完之后,才会触发onClick。也就是说,在此之前任意位置return了true,onClick都不会被调用。


至此,我产生了一个疑问:Android为什么要这么设计事件传递机制?

① onInterceptTouchEvent:是Layout特有的,是给予Layout对于Event的独立把控权,而不是傻傻的等待事件再冒泡传递回onTouchEvent。

② onTouch:区分于onTouchEvent,给开发者不破坏基础事件传递逻辑(比如 Button的onTouchEvent默认的Super.onTouchEvent()里面是有逻辑判断来决定return值)的情况下对事件有自己的把控操纵权。


本文转自chainli 51CTO博客,原文链接:http://blog.51cto.com/lichen/1397112,如需转载请自行联系原作者

相关文章
|
Java Android开发
【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )
【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )
211 0
【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )
|
Android开发 数据格式 XML
|
Android开发 计算机视觉 JavaScript
|
Android开发
|
Java Android开发
|
Java Android开发
细说Android事件传递
一、View的dispatchTouchEvent和onTouchEvent 探讨Android事件传递机制前,明确android的两大基础控件类型:View和ViewGroup。View即普通的控件,没有子布局的,如Button、TextView. ViewGroup继承自View,表示可以有子控件,如Linearlayout、Listview这些。而事件即MotionEve
1284 0
|
Android开发
Android事件分发详解(五)——Touch事件传递验证
MainActivity如下:package cn.c; import android.os.Bundle; import android.app.
839 0
|
Android开发
Android事件分发详解(四)——事件传递基础示例
MainActivity如下:package com.cn; import android.app.Activity; import android.
1193 0
|
Android开发
图解Android事件传递之ViewGroup篇
本篇文章主要讲述ViewGroup中关于触摸事件传递的相关逻辑。主要梳理一下dispatchTouchEvent函数。 一些知识点 FLAG_DISALLOW_INTERCEPT,可以使用requestDisallowInterceptTouchEvent来设置ViewGroup的这个标记位,让ViewGroup不拦截事件。