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)也都给我传上来.



SWF 文件分析

SWF 文件头分析 (一): swf文件头包含的信息量巨大。告诉了人们SWF文件工作的方式方法等基本信息呵 Macromedia Flash文件格式是Macromedia Flash播放器在互联网...
  • spring19840513
  • spring19840513
  • 2011年08月22日 17:55
  • 1192

联机分析处理(OLAP)

转载自北大高科网站,http://www.pku-ht.com/) 联机分析处理 (OLAP) 的概念最早是由关系数据库之父E.F.Codd于1993年提出的,他同时提出了关于OLAP的12条准则。O...
  • ForeverIcePoint
  • ForeverIcePoint
  • 2007年03月30日 15:54
  • 612

在0.2秒时间间隔内多次点击只响应一次点击事件

[[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(todoSomething:) object...
  • haibing_521
  • haibing_521
  • 2016年10月17日 17:38
  • 641

如何设置button只能点击一次

首先声明一个boolean类型的变量 click private boolean click=true; button=(Button)findViewById(R.id.button); ...
  • LUL12
  • LUL12
  • 2016年01月17日 17:55
  • 2077

Android连续快速点击多次执行某操作的功能

mImgLogo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ...
  • jaycee110905
  • jaycee110905
  • 2015年03月20日 18:24
  • 4291

android 防止 多次点击 重复点击按钮

/** * @Fields lastClickTime : 最后一次点击时间 */ private static long lastClickTime1; /**首页,发现页,我的页 处于...
  • wuqilianga
  • wuqilianga
  • 2016年07月04日 16:27
  • 535

Android每隔几秒做一个动作实现方法

Android每隔几秒做一个动作实现方法 Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override ...
  • PrinceCat2012
  • PrinceCat2012
  • 2014年11月30日 17:00
  • 5820

一定时间内连续点击只有最后一次点击进行ajax提交

+ var this_timer_id = null; function clickIncrement(){              if(typeof this_timer_id !...
  • jason_czm
  • jason_czm
  • 2017年02月09日 17:28
  • 530

Android 防止短时间内重复点击技巧

在Android开发中,当完成一款软件时,测试人员会对软件进行测试,本来可以正常运行的软件在测试人员里就可以出现意想不到的bug,其中一个比较常见的问题就是短时间内重复点击一个按钮,本来正常点击只执行...
  • k763925053
  • k763925053
  • 2014年10月22日 16:16
  • 1714

JSP:include指令与include动作的区别

用法: include指令: %@include file="filePath" %> 一个页面只能使用一次 include动作: 处理方式: include指令: 被inc...
  • y200930690129
  • y200930690129
  • 2012年04月09日 09:10
  • 547
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 一次点击动作的分析
举报原因:
原因补充:

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