原文链接 http://sparkyuan.me/ 转载请注明出处

介绍

点击事件的事件分发就是对MotionEvent事件的分发过程。当一个MotionEvent产生了以后,系统须要把这个事件传递给一个详细的View,而这个传递的过程就是分发的过程。

涉及到的三个方法

  • dispatchTouchEvent:用来进行事件的分发,假设事件可以传递给当前View。那么此方法一定会被调用,返回结果受当前View的onTouchEvent和View的dispatchTouchEvent方法的影响,表示是否当消耗当前事件
  • onInterceptTouchEvent:用来推断是否拦截某个事件,假设当前View拦截了某个事件,那么在同一个事件序列其中,此方法不会被再次调用,返回结果表示是否拦截当前事件;
  • onTouchEvent:在dispatchTouchEvent方法中调用。用来处理点击事件,返回结果表示是否消耗当前事件,假设不消耗,则在同一个事件序列中。当前View无法再次接收到事件。

三个方法之间的关系

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

上面的伪代码非常好的描写叙述了三者之间的关系。假设当前View拦截事件,就交给自己的onTouchEvent去处理,否则就传给子View。直到事件被终于处理。

事件分发顺序

当一个点击事件产生后。它的传递步骤例如以下:Activity -> Window -> View。假设View的onTouchEvent返回false,那么它的父容器onTouchEvent将会被调用。以此类推。终于将由Activity的onTouchEvent处理。

Activity对事件的分发过程

Activity -> Window -> DecorView。

Windows是一个抽象类。可以控制顶级View的外观和行为策略,PhoneWindow是这个类的唯一个实现。

DecorView就是当前界面的底层容器。即setContentView所设置的View是它的一个子View。

顶级View对点击事件的分发过程

ViewGroup -> dispatchTouchEvent -> onInterceptTouchEvent -> onTouch or onTouchEvent

顶级View一般都是一个ViewGroup。

拦截事件之后,假设ViewGroup设置了mOnTouchListener,则Listener里的onTouch方法会屏蔽掉onTouchEvent。假设onTouchEvent设置了mOnClickListener。则Listener里的onClick会被调用。假设ViewGroup没有拦截则传给子View直到整个事件分发完毕。

View对点击事件的处理过程

假设View设置了mOnTouchListener,则Listener里的onTouch方法会屏蔽掉onTouchEvent。

假设onTouchEvent设置了mOnClickListener,则Listener里的onClick会被调用。

View没有onInterceptTouchEvent方法,一旦有点击事件传递给他。他就会处理。

注:上面仅仅是描写叙述了事件分发过程的原理,关于源代码的分析请參考书本的对应章节。

欢迎转载。转载请注明出处http://blog.csdn.net/l664675249/article/details/50738102

Android中View的事件分发机制——Android开发艺术探索笔记的更多相关文章

  1. Android中View的事件分发机制

    简介 事件也称MotionEvent,事件分发机制就是对MotionEvent事件的分发过程,即当一个MotionEvent发生之后,系统需要把这个事件传递给一个具体的View. 点击事件的分发过程由 ...

  2. Android View的事件分发机制和滑动冲突解决方案

    这篇文章会先讲Android中View的事件分发机制,然后再介绍Android滑动冲突的形成原因并给出解决方案.因水平有限,讲的不会太过深入,只希望各位看了之后对事件分发机制的流程有个大概的概念,并且 ...

  3. Android 进阶学习:事件分发机制全然解析,带你从源代码的角度彻底理解(上)

    http://blog.csdn.net/guolin_blog/article/details/9097463 事实上我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客開始,就零 ...

  4. Android View的事件分发机制

    准备了一阵子,一直想写一篇事件分发的文章总结一下.这个知识点实在是太重要了. 一个应用的布局是丰富的,有TextView,ImageView,Button等.这些子View的外层还有ViewGroup ...

  5. 【Android - 自定义View】之View的事件分发机制

    参考资料: View事件分发:http://blog.csdn.net/pi9nc/article/details/9281829 ViewGroup事件分发:http://blog.csdn.net ...

  6. 【Android - 进阶】之事件分发机制

    参考资料: View事件分发:http://blog.csdn.net/pi9nc/article/details/9281829 ViewGroup事件分发:http://blog.csdn.net ...

  7. View的事件分发机制解析

    引言 Android事件构成 在Android中,事件主要包含点按.长按.拖拽.滑动等,点按又包含单击和双击,另外还包含单指操作和多指操作.全部这些都构成了Android中的事件响应.总的来说.全部的 ...

  8. Android开发艺术探索笔记——View(二)

    Android开发艺术探索笔记--View(二) View的事件分发机制 学习资料: 1.Understanding Android Input Touch Events System Framewo ...

  9. Android开发艺术探索笔记—— View(一)

    Android开发艺术探索笔记 --View(一) View的基础知识 什么是View View是Android中所有控件的基类.是一种界面层控件的抽象. View的位置参数 参数名 获取方式 含义 ...

随机推荐

  1. git (unable to update local ref )

    https://stackoverflow.com/questions/2998832/git-pull-fails-unable-to-resolve-reference-unable-to-upd ...

  2. Java-改变Class

    改变一个Class对象的类型 package com.tj; public class MyClass2 { public static void main(String[] args) { Obje ...

  3. Leetcode 375.猜数字大小II

    猜数字大小II 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字. 每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了. 然而,当你猜了数字 x ...

  4. CocoaAsyncSocket一个第三方Socket库

    github地址:https://github.com/robbiehanson/CocoaAsyncSocket github上的不完整,cocochina也有demohttp://code4app ...

  5. 【bzoj4383】[POI2015]Pustynia 线段树优化建图+差分约束系统+拓扑排序

    题目描述 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],...,a[r- ...

  6. 最小的图灵完备语言——BrainFuck

    最小的图灵完备语言--BrainFuck 图灵完备性(Turing completness) 在可计算性理论(computability theory)中,图灵等价指的是:对于两个计算机A和B,如果A ...

  7. Ionic 如何把左上角的按钮去掉?

    代码实现: <ion-header > <ion-toolbar> <ion-buttons start> <a href="#"> ...

  8. R 包安装、载入和卸载

    生物上的一些包可以这样安装 source("https://bioconductor.org/biocLite.R") biocLite("affy") 一般的 ...

  9. (7)C#连DB2---oledb方式

    1安装客户端 安装DbVisualizer Free 客户端软件 2编目 用 win+r  输入 db2cmd 启动命令行 要远程操作数据库,首先要进行编目,分三个步骤: 1. 在客户端建立服务器端数 ...

  10. Codeforces 86D Powerful array (莫队算法)

    题目链接 Powerful array 给你n个数,m次询问,Ks为区间内s的数目,求区间[L,R]之间所有Ks*Ks*s的和. $1<=n,m<=200000,   1<=s< ...