******** ******** 第一部分: 介绍说明 ******** ********     
 
个人感觉在做交互的时候, 对于Android的按键分发的理解还是比较重要的.
这些内容在<深入理解Android> <Android系统源代码情景分析> 还有一些博客内容中都有写到.
最近想着要仔细的了解一下整体的分发机制, 并且希望能真实的应用在项目中, 所以看了一下InfoQ网站的这篇文章, 感觉写的还不错, 个中有些地方我觉得说的不是很清晰, 但是整体思路自己感觉是理清楚了. 如果发现我理解的有错误, 希望能得到各位的指点(T_T不然会一直错下去的). 
 
相关参考资料:
 
 
******** ********  ******** ********
 
与按键分发有关的类: Activity, View, Window(ViewGroup继承自View, 自定义视图继承自View. ViewGroup特别的有onInterceptTouchEvent()方法, 该方法位于)
 
Activity相关函数:
    dispatchTouchEvent
    onTouchEvent
View相关函数
    dispatchTouchEvent
    onTouch
    onTouchEvent
    onClick
ViewGroup相关函数
    dispatchTouchEvent
    onInterceptTouchEvent
    onTouch
    OnTouchEvent
    onClick
 
******** ******** 按键分发实现细节 ******** ********
 
====>>>> Activity中的按键分发细节:
 
boolean dispatchTouchEvent()
{
// Window::superDispatchTouchEvent(MotionEvent ev)方法由系统实现
// 该方法个人感觉存在于PhoneWindow.java类中, 但是文章中没有写的很清楚. 甚至我觉得是有误导... 需要再斟酌.
// 个人猜测该方法主要用于获取xml文件解析出来的View, 通过区分ViewGroup和普通View, 再执行对应的按键分发逻辑.
if (getWindow().superDispatchTouchEvent(MotionEvent::ev))
{
// 这里表明, 如果dispatchTouchEvent函数返回true, 则表示子类消费过触摸事件
// 如果子类没有消费过触摸事件, 则执行onTouchEvent()方法
return true ;
}
else
{
return onTouchEvent(MotionEvent::ev) ;
}
}    
 
总结, 如果子类的dispatchTouchEvent(MotionEvent ev)方法返回了true, 则Activity不再处理该触摸事件. 否则Activity将触摸事件传递给Activity::onTouchEvent(MotionEvent ev)方法处理. 该方法是触摸事件的终点. 
 
====>>>> View中的按键分发细节

// Activity会先将触摸事件下发到视图控件中
// 触摸事件的入口为dispatchTouchEvent()函数
Window::superDispatchTouchEvent(MotionEvent ev)
{
// View处理触摸事件的入口, 也是唯一的入口(个人怎么理解的, 不保证正确性)
// 其实这里也应该有个遍历, 如果是ViewGroup, 需要先探测所有自孩子的处理结果.
public boolean dispatchTouchEvent(MotionEvent ev)
{
// 对于ViewGroup, 需要先查看是否拦截当前触摸事件,
if (this instanceof ViewGroup)
{
if (!onInterceptTouchEvent())
{
for (int i = 0 ; i < getChildCount() ; i++)
{
if (getChildAt(i).dispatchTouchEvent())
{
return true ;
}
}
}
} // 这里说明触摸事件监听优先于onTouchEvent并且可以拦截按键分发链条, 从而阻止onTouchEvent函数的执行
if (null != mTouchListener && mTouchListener.onTouch(MotionEvent::ev))
{
return true ;
} if (onTouchEvent(MotionEvent::ev))
{
return true ;
} return false ;
}
} public boolean View::onTouchEvent(MotionEvent ev)
{
if (ev.getAction() == MotionEvent.ACTION_UP)
{
….
return performClick() ;// 该处为猜测
}
} public boolean View::performClick()
{
if (null != onClickListener)
{
return true ;
} return false ;
}
 
******** ******** 总结 ******** ********
  1. 事件分发的起始点是Activity::dispatchTouchEvent(MotionEvent ev);
  2. dispatchTouchEvent(MotionEvent ev)将事件处理传递给onTouchListener和onTouchEvent()方法, 都返回false表示没有消费
  3. 如果是ViewGroup在dispatchTouchEvent()执行消费逻辑前, 需要递归调用子孩子的dispatchTouchEvent()方法查看子孩子是否消费该事件
  4. onTouchEvent()方法中通过performClick()方法执行了onClickListner的onClick事件
******** ******** END ******** ********
     

Android事件分发小结的更多相关文章

  1. Android事件分发机制源码分析

    Android事件分发机制源码分析 Android事件分发机制源码分析 Part1事件来源以及传递顺序 Activity分发事件源码 PhoneWindow分发事件源码 小结 Part2ViewGro ...

  2. Android事件分发机制具体解释

    转载注明出处:http://blog.csdn.net/xiaohanluo/article/details/52416141 1. 概述 Android日常研发时,与View接触占领相当多的时间.而 ...

  3. Android 事件分发机制具体解释

    很多其它内容请參照我的个人网站: http://stackvoid.com/ 网上非常多关于Android事件分发机制的解释,大多数描写叙述的都不够清晰,没有吧来龙去脉搞清晰,本文将带你从Touch事 ...

  4. Android事件分发机制二:viewGroup与view对事件的处理

    前言 很高兴遇见你~ 在上一篇文章 Android事件分发机制一:事件是如何到达activity的? 中,我们讨论了触摸信息从屏幕产生到发送给具体 的view处理的整体流程,这里先来简单回顾一下: 触 ...

  5. Android事件分发机制浅谈(一)

    ---恢复内容开始--- 一.是什么 我们首先要了解什么是事件分发,通俗的讲就是,当一个触摸事件发生的时候,从一个窗口到一个视图,再到一个视图,直至被消费的过程. 二.做什么 在深入学习android ...

  6. 通俗理解Android事件分发与消费机制

    深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...

  7. Android事件分发机制(下)

    这篇文章继续讨论Android事件分发机制,首先我们来探讨一下,什么是ViewGroup?它和普通的View有什么区别? 顾名思义,ViewGroup就是一组View的集合,它包含很多的子View和子 ...

  8. Android事件分发机制(上)

    Android事件分发机制这个问题不止一个人问过我,每次我的回答都显得模拟两可,是因为自己一直对这个没有很好的理解,趁现在比较闲对这个做一点总结 举个例子: 你当前有一个非常简单的项目,只有一个Act ...

  9. android事件分发机制

    android事件分发机制,给控件设置ontouch监听事件,当ontouch返回true时,他就不会走onTouchEvent方法,要想走onTouchEvent方法只需要返回ontouch返回fa ...

随机推荐

  1. maven中classpath路径(转)

    前几天看见一个大神总结classpath文章,觉得特别有用.所以,特此转载(http://my.oschina.net/GivingOnenessDestiny/blog/603505) 各种path ...

  2. 我常用的那些linux命令

    我常用的那些linux命令 用linux也有些年头了,说来也忏愧,说是有些年头了,其实也还是个不长进的主.记得第一次接触linux是boss跟我说的怎么操作,什么编辑模式,按i,a,o进入编辑模式.在 ...

  3. Windows Server 2012 R2桌面化详细设置图解

    一.任务栏左下角启动服务器管理器,然后进行设置. 1.登录不显示服务器管理器 2.本地服务器,看到右边的IE增强的安全配置,如图所示,关闭两项内容.这样就关闭了IE增强安全提示框. 3.“工具”菜单, ...

  4. ACID属性区别

    事务是指对系统进行的一组操作,为了保证系统的完整性,事务需要具有ACID特性,具体如下: 1. 原子性(Atomic)     一个事务包含多个操作,这些操作要么全部执行,要么全都不执行.实现事务的原 ...

  5. C/C++: C++变量和基本类型

    1. 如何选择类型的准则 当明确知晓数值不可能为负的时候,应该选择无符号类型. 使用int执行整数运算的时候,在实际应用中,short常常显得太小而long一般和int有一样的尺寸,如果数值超过了in ...

  6. Delphi容器类之---Tlist,TStringlist,THashedStringlist的效率比较

    转载自:http://www.ylzx8.cn/windows/delphi/73200.html 本人在做一个测试,服务器是IOCP的,我假定最大链接数是50000个. 测试背景:如果每个链接之间的 ...

  7. Linux的简单介绍和常用命令的介绍

    Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...

  8. AngularJS学习 01进入Angular世界

    Angular下载 各个版本的下载地址:https://code.angularjs.org/ 打开上述URL,页面如下图: 点击需要的版本,跳出如下页面: 点击红色框内容即可下载完整的压缩包. 还可 ...

  9. [C#].NET中几种Timer的使用

    这篇博客将梳理一下.NET中4个Timer类,及其用法. 1. System.Threading.Timer public Timer(TimerCallback callback, object s ...

  10. 【leetcode】Minimum Depth of Binary Tree

    题目简述: Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along th ...