关闭

Android事件派发机制简析

131人阅读 评论(0) 收藏 举报

参考:http://blog.csdn.net/yanbober/article/details/45887547
http://blog.csdn.net/yanbober/article/details/45912661

  • Android控件的Listener事件触发顺序是先触发onTouch,其次onClick。
  • 如果控件的onTouch返回true将会阻止事件继续传递,返回false事件会继续传递。

在View的触摸屏传递机制中通过分析dispatchTouchEvent方法源码我们会得出如下基本结论:

  • 在Android中你只要触摸控件首先都会触发控件的dispatchTouchEvent方法
  • 触摸控件(View)首先执行dispatchTouchEvent方法。
  • 在dispatchTouchEvent方法中先执行onTouch方法,后执行onClick方法(onClick方法在onTouchEvent中执行)。
  • 如果控件(View)的onTouch返回false或者mOnTouchListener为null(控件没有设置setOnTouchListener方法)或者控件不是enable的情况下会调运onTouchEvent,dispatchTouchEvent返回值与onTouchEvent返回一样。
  • 如果控件不是enable的设置了onTouch方法也不会执行,只能通过重写控件的onTouchEvent方法处理(上面已经处理分析了),dispatchTouchEvent返回值与onTouchEvent返回一样。
  • 如果控件(View)是enable且onTouch返回true情况下,dispatchTouchEvent直接返回true,不会调用onTouchEvent方法。

View的dispatchTouchEvent方法中调运的onTouchEvent方法

  • onTouchEvent方法中会在ACTION_UP分支中触发onClick的监听。
  • 当dispatchTouchEvent在进行事件分发的时候,只有前一个action返回true,才会触发下一个action。通过设置一个View的触摸监听事件后(setOnTouchListener),对应的onTouch( )方法也是如此

类似Button这种控件都是View的子类,类似布局这种控件都是ViewGroup的子类,而ViewGroup又是View的子类

  • Android事件派发是先传递到最顶级的ViewGroup,再由ViewGroup递归传递到View的。
  • 在ViewGroup中可以通过onInterceptTouchEvent方法(这个方法也是ViewGroup独有的)对事件传递进行拦截,onInterceptTouchEvent方法返回true代表不允许事件继续向子View传递,返回false代表不对事件进行拦截,默认返回false。
  • 子View中如果将传递的事件消费掉,ViewGroup中将无法接收到任何事件。

ViewGroup(如LinearLayout)中的事件主要是针对是否分发到子View的,而View(如Button)中的事件主要是讨论View的事件是否要向下一级事件传递(如touch事件传递到click事件)。

0
0
查看评论

两张图让你看懂事件派发机制

首先是ViewGroup的事件派发 下面是View的事件派发机制
  • qq_24554061
  • qq_24554061
  • 2016-02-28 00:24
  • 680

cocos2d-x v3.2 触摸事件派发机制

于cocos2d-x v3.0alpha0加入 介绍 cocos2d-x 3.0介绍了一种新的响应用户事件的机制,本文档介绍它的使用。 基础: 事件监听器封装了事件处理代码事件派发器通知用户事件的监听器事件对象  包含了事件的相关信息 要响应事件就先...
  • hj3601947
  • hj3601947
  • 2014-07-31 21:38
  • 762

Android源码分析-点击事件派发机制

转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17339857 概述 一直想写篇关于Android事件派发机制的文章,却一直没写,这两天刚好是周末,有时间了,想想写一篇吧,不然总是只停留在会用的层次上但是无法了解其内部机制。我...
  • singwhatiwanna
  • singwhatiwanna
  • 2013-12-16 01:35
  • 18631

Unity3D事件派发机制之Delegate

上一章:【基于MONO事件派发机制之SendMessage】 废话不多说,直接上代码。 [mw_shl_code=csharp,true]/* * NotificationDelegCenter * 使用代理监听和派发事件 * 相对SendMessage使用delegate,提高了消息派发效率 ...
  • dashuaifenyun1991
  • dashuaifenyun1991
  • 2015-01-27 19:23
  • 1733

JAVA-26.1-jQuery基础、派发事件、效果、选择器

一:jQuery的引入jQuery本质上就是一个是js类库,对常用的方法和对象进行封装,方便我们使用。   1.我们之前DOM编程:var obj = Document.getElementById(id); 此处获取的obj是什么对象—dom对象   2.我们如果想使用Jquery中里面已经封...
  • qq_30718113
  • qq_30718113
  • 2017-07-05 00:49
  • 152

Objective-C运行时消息派发机制

Objective-C运行时消息派发机制 “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。” Objective-C是一门动态语言,鸭子类型是动态语言的重要特性,而id则是Objective-C中最大的一只鸭子。而Objective-C是如何实现鸭子类型的...
  • wwwxl
  • wwwxl
  • 2015-12-11 16:37
  • 363

cocos2d-事件派发机制

于cocos2d-x v3.0alpha0加入 介绍 cocos2d-x 3.0介绍了一种新的响应用户事件的机制,本文档介绍它的使用。 基础: 事件监听器 封装了事件处理代码事件派发器 通知用户事件的监听器事件对象   包含了事件的相关信息 要响应事件就先必须创建有EventLi...
  • ko_tin
  • ko_tin
  • 2016-10-22 22:03
  • 160

如何取消JS事件的派发——stopPropagation()

使用event.stopPropagation();可阻止事件的派发。 个人浅显理解派发为 本次操作后面所能触发的事件将不再触发。 说明: stopPropagation()方法将停止事件的传播,阻止它被分派到其他 Document 节点。在事件传播的任何阶段都可以调用它。注意,虽然该方法不能...
  • zcl_love_wx
  • zcl_love_wx
  • 2016-06-16 15:16
  • 1181

根据jquery自定义事件写一个事件订阅派发demo

1.未绑定dom对象的观察者模式demo var scope = { on:function(name,callback){ this.arr = this.arr || []; this.arr[na...
  • u014787301
  • u014787301
  • 2016-08-04 10:04
  • 735

关于Android事件派发流程的理解

以前看了很多人介绍的Android事件派发流程,但最近使用那些来写代码的时候出现了不少错误。所以回顾一下整个流程,简单介绍从手触摸屏幕开始到事件在View树派发,从源码上分析ViewGroup.dispatchTouchEvent。
  • xxx_zhi
  • xxx_zhi
  • 2016-05-12 20:04
  • 5175
    个人资料
    • 访问:9592次
    • 积分:438
    • 等级:
    • 排名:千里之外
    • 原创:36篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论