******** ******** 第一部分: 介绍说明 ******** ********     
 
个人感觉在做交互的时候, 对于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. CGAffineTransform

    这个是CoreGraphics框架中的CGAffineTransform类,可用于设定UIView的transform属性.控制视图的缩放.旋转和平移操作.另称仿射变换矩阵. Quartz转换实现原理 ...

  2. html的a标签display:block之后文字竖直居中

    设置行高和a标签的高度一样就能居中,使用line-height

  3. Ionic 常用插件

    ionic扩展插件 1.ionic-timepicker 时间选择 https://github.com/rajeshwarpatlolla/ionic-timepicker   2.ionic-da ...

  4. $stateProvider

    在你的应用中大多数状态都有与其相关联的 url,路由控制不是设计完成 state 之后的事后想法,而是开始开发时就应该考虑的问题. 这里是如何设置一个基本url. 12345 $stateProvid ...

  5. MFC 创建多层目录

    创建多层目录 BOOL CTestToolCtr::CreateFolder(CString strNewFolder) { /************************************ ...

  6. [Python数据分析]新股破板买入,赚钱几率如何?

    这是本人一直比较好奇的问题,网上没搜到,最近在看python数据分析,正好自己动手做一下试试.作者对于python是零基础,需要从头学起. 在写本文时,作者也没有完成这个小分析目标,边学边做吧. == ...

  7. 用代码控制鼠标键盘(C#语言)

    前些时间想做一个鼠标点击器,用到了这些知识. 下面整理记录一下. ps.感谢各位大神 下面直接上代码 1.鼠标的控制 class MouseMove { #region MouseEvent [Sys ...

  8. C#调用win32 api 操作其它窗口

    实现以下功能: 找到窗体 找到控件(也叫子窗体) 获取内容 获取位置 设置 位置 内容 鼠标点击 示范 1. 找窗体 以操作系统自带的计算器为例 string clWindow = "Cal ...

  9. ajaxform使用

    需要引入  jquery.form.js  jquery.js 1.提交的表单 <form id="myForm" action="comment.php" ...

  10. Unity Cookie

    1   在Unity里面,选择脚本单击左键打开 Sync Mono Development  这样就可以打开整个工程的脚本文件 进而才能在脚本中继续进行切换      Mesh    MeshFilt ...