原文链接 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. 1 producer — n consumers 模型 实现

    #include<stdio.h> #include<string.h> #include<pthread.h> #include<stdlib.h> ...

  2. centos 服务器配置

    安装防火墙 安装Apache 安装MySQL 安装PHP 安装JDK 安装Tomcat 服务器上搭建Apache +MySQL+PHP +JDK +Tomcat环境,用的是Linux Centos7. ...

  3. appium+python自动化-xpath定位

    基本属性定位 以淘宝app为例,定位左上角扫一扫按钮 1.可以通过text文本定位到 //*[@text='text文本属性'] # 定位text driver.find_element_by_xpa ...

  4. 公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法!

    公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法! 先存档再说,以后实验报告还得打印上交. Miller-Rabin大素数判定对于学算法的人来讲不是什么难事,主要了解其原理. 先来灌 ...

  5. 九度oj 题目1347:孤岛连通工程

    题目描述: 现在有孤岛n个,孤岛从1开始标序一直到n,有道路m条(道路是双向的,如果有多条道路连通岛屿i,j则选择最短的那条),请你求出能够让所有孤岛都连通的最小道路总长度. 输入: 数据有多组输入. ...

  6. EasyUI 加载Tree

    function LoadTree(result) { mainMenu = $('#mainMenu').tree({ url: "/ajax/GetTreeJson.ashx" ...

  7. [POJ1741]Tree(点分治模板)

    传送门 良心解析 其实以前在求某段序列上的区间统计问题时就碰到过类似于这样的思想. 当时的区间统计问题思路大致是这样: 选取一个点作为中间点,从这个点的左边和右边统计出满足条件的点对.然后当前的中间点 ...

  8. selenium 与 firefox版本不兼容报错

    org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on port 7055 ...

  9. hdu 1166 树状数组(线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  10. 【HDOJ5978】To begin or not to begin(概率)

    题意:有k个黑球和1个红球,两个轮流抽,抽到红球算赢,问先手赢的概率大还是后手大还是相等 k<=1e5 思路:手算前几项概率 大胆猜想 #include<cstdio> #inclu ...