Android 一次点击动作的分析

原创 2015年11月20日 17:52:27

Android一次点击动作的分析

android中的事件类型分为按键事件和屏幕触摸事件,

Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。 

一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP

下面就以一个点击动作为例,来分析一下Android系统的事件传递和处理.


先说明一下,绿色是自定义的控件(TestView),继承自TextView, 红色也是自定义控件(TestLayout),继承自linearLayout,最下面的是Activity的布局文件.













	我们将一个点击动作简单的分解为Down事件和Up事件.当点击屏幕的时候,Down事件会先发生,此时会被android系统监听到.


1传递事件

当系统监听到Down事件时,首先是调用事件分发函数.就是dispatchTouchEvent,调用顺序是 

Activity.dispatchTouchEvent()-->TestLayout.dispatchTouchEvent()-->TestView.dispatchTouchEvent().

Down事件从Activity传递到最上面的TestView.也就是说.事件的传递是从下面向上面传递.


2处理事件

当最上面的TestView控件收到这个Down事件的时候,它有两个选择.一个选择是处理这个Down事件,另一个选择当然就是不处理该事件.如果最上面的这个TestView选择处理这个Down事件,那就是说在TestViewonTouchEvent函数的Action_down分支里面返回true,

那就是说现在这个Down事件被TestView控件消耗掉了.之后处于TestView下面的TestLayout和最下面的Activiyt就没机会处理这一次点击所产生的Down事件了.此时Down事件就结束了.如果TestView选择不处理这个Down事件,就是说TestViewonTouchEvent函数的Action_down分支里面返回false,(或者选择默认)ok,这个时候Down事件会继续向下去找TestLayout.同时Down事件也做了一个艰难的决定,之后所有的事件,包括Move事件,Up事件都不会再传递给最上面的TestView控件了.因为你TestView都不甩我Down事件,那我之后的事件也不去找你TestView控件


  现在Down事件来到了TestLayout控件哪里,TestLayout也有两个选择.要么处理.要么不处理.处理了Down事件就不在向下传,不处理那以后其他的事件也没有TestLayout什么事.

最后Down事件就这样从Activitydispatch上来,从最上面开始寻找处理它的地方.找到了就处理完结束.如果从最上面的控件一路下来,都没人处理Down事件,那Down事件最后还是会回到Activity哪里.如果回到Activity这,那Activity肯定会处理,(因为最开始也从Activity这里送出去的, 呵呵)


  ok,Down事件完了,那就该Up事件出场了.Up事件的传递是根据前面Down事件的处理情况来决定的.Up事件只会被传递到Down事件被处理的控件上去.比如说.前面Down事件如果被TestView这个控件处理的话,那Up事件也会被送到TestView这个控件上的.Up事件送到TestView控件之后,TestView也有两个选择,要么处理,要么不处理.如果TestView控件处理了这个Up事件,也就是说TestViewonTouchEvent函数的Action_Up分支里面返回true,那该Up事件就结束了.如果TestView控件不处理这个Up事件,Up事件就只好再向下去找TestLayout控件.那TestLayout控件也有两个选择,以此类推,如果都不处理,那最后就只能右Activity处理了.


这就是Activity系统的一次点击动作所发生的事情.如果我们的自定义控件实现了onTouchEvent()方法.如果想在Action_Up分支中实现有关的逻辑处理,那我们的Action_Down分支就必须返回true,表示我会招待好Down事件,希望Down事件不要生气,将以后的事件(Move Up)也都给我传上来.



MFC学习笔记之:MFC最基本动作(如创建窗口,点击取消等)函数的执行顺序

一、MFC应用程序中处理消息的顺序:1.AfxWndProc()       该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc2.AfxCallWndProc() ...

button快速点击造成多次重复动作相应的解决办法

UIButton+touch.h #import #define defaultInterval 3 //默认时间间隔 @interface UIButton (touch) /**设置点击时...

QT用信号和处理机制为事件添加处理动作(点击按钮显示helloworld)

首先新建一个项目命名为“QtGuuitest3” 双击 "QtGuitest3.ui" 其中按钮的名字是pushButton 多行文本框为plainTextEdit ...

java 多线程 点击按钮一次创建一个小球

练习使用多线程来实现点击按钮创建一个小球并且多个小球同时移动的效果

C#之WinForm基础 运行多个窗体时,点击按钮,一次关闭所有窗体

慈心积善融学习,技术愿为有情学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 运行多个窗体时,一次关闭所有窗体。 要点在于:只需要关闭主窗体,所有窗体就全都关闭了!...

图片的每点击一次旋转90度, filter和css3属性

ImageRotation                                                          #container {         ...
  • zz_whw
  • zz_whw
  • 2017年04月19日 15:20
  • 962

JTabel选择表格事件监听时,用鼠标点击一次,会出现两次事件的原因。

1。选择某一行(当选择这一行时,需要产生某种事件) 当用鼠标对表格进行选取,在响应行选取变化事件(ListSelectionListener)时,鼠标按下会响应一次,鼠标释放又会响应一次,因此一...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 一次点击动作的分析
举报原因:
原因补充:

(最多只允许输入30个字)