Android知识梳理之事件传递机制
来源:互联网 发布:java服务器socket编程 编辑:程序博客网 时间:2024/04/29 14:40
Android的事件传递机制.
首先我们来明白一些相关的概念:
什么是事件呢?这里的事件就是指触摸的事件,我们知道当我们点击手机的屏幕的时候按下(down),移动(move),抬起(up).这样的一个过程就称为一个事件序列.如:down,move.move...,up当然可以是没有移动这个事件的,但是点击和抬起的事件是必须要有的.例如:down,up.
View和ViewGrop。Viewgrop我们可以理解为是存放View的容器,如:relativelayout,linerlayout等等都是继承自ViewGrop.View则是最小的控件如:TextView,ImageView等等都是继承自View的.另外Viewgrop是继承自View的.
事件传递的顺序是:1、传递顺序:Activity->Window->View
Activity中没有onInterceptTouchEvent()方法,也就是说activity不能对事件进行拦截(这不难理解activity处在事件的顶层).
View中没有onInterceptTouchEvent()方法.
这里的事件包含如DOWN,MOVE和UP事件.如果谁在onTouchEvent()里面处理了DOWN,那么所有的动作(MOVE,UP)都将交给这个View来处理.一般我们在自定义ViewGroup时不会拦截Down事件,因为一旦拦截了Down事件,那么后续的Move和Up事件都不会再传递下去到子元素了,事件以后都会只交给ViewGroup这里。
当发生touch事件的时候,首先是由activity逐渐向内传递.如果到了最底层的控件仍然没有对事件作出处理那么事件将会回传.
如果执行到了事件分发public boolean dispatchTouchEvent(MotionEvent ev),这个方法返回值有三种:
- 如果 return true,事件会分发给当前 View 并由 dispatchTouchEvent 方法进行消费,同时事件会停止向下传递(相当于事件被该方法吃掉了,既不会上传也不会下发,也不会走自己的onTouchEvent方法);
- 如果 return false,事件分发分为两种情况:
- 如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent() 进行消费;
- 如果当前 ViewGrop 获取的事件,则会将事件返回给父 View 的 onTouchEvent() 进行消费。
- 如果在activity的dispatchTouchEvent(MotionEvent ev)中返回false那么该事件也会消失(相当于事件被该方法吃掉了,既不会上传也不会下发,也不会走自己的onTouchEvent方法)
- 如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。
如果执行到了事件拦截:onInterceptTouchEvent方法,这个时候也是有三种返回值的:
- 如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由当前 View 的 onTouchEvent ()进行处理(如果不处理继续向上回传);
- 如果 onInterceptTouchEvent 返回 false,则表示将事件放行,当前 ViewGrop 上的事件会被传递到子 ViewGrop 上,再由子 ViewGrop 的 dispatchTouchEvent() 来开始这个事件的分发;
- 如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev)这里也是分两种情况:
1.如果点击ViewGroup,则控件树是Activity-->ViewGroup(也就是没有子控件了,该ViewGrop是最底层的),调用该ViewGrop的onTouchEvent()(也就是自己将事件消费掉,自己如果不消费ontouch事件会继续回传);
2.如果点击View,则是Activity-->ViewGroup-->View(也就是的ViewGroup存在子View的情况).将事件从ViewGroup转移到View的dispatchTouchEvent()(也就是将事件传递给子控件的dispatchTouchEvent()事件进行分发的操作)。
- 如果事件传递到当前 View 的 onTouchEvent 方法,而该方法返回了 false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 也返回 false,这个事件就会“消失”,而且接收不到下一次事件。
- 如果返回了 true 则会接收并消费该事件,此时事件就交给该View进行消费,不会再向上传递.
- 如果返回 super.onTouchEvent(ev) 默认处理事件的逻辑和返回 false 时相同。
0 0
- Android知识梳理之事件传递机制
- 【知识梳理1】Android触摸事件机制
- Android之事件传递机制
- Android之事件传递机制
- Android事件传递机制之【onTouch方法】
- Android基础之onTouch事件传递机制
- Android学习之 Touch事件传递机制
- android之事件分发传递机制
- Android自定义view之事件传递机制
- Android知识回顾之事件分发机制
- Android知识梳理之Intent
- android 事件传递机制
- android 事件传递机制
- android事件传递机制
- Android事件传递机制
- Android 事件传递机制
- Android事件传递机制
- Android事件传递机制
- 解析Visual Studio 2015促进生产力的10个新功能
- ACM刷题之HDU————A + B Problem II
- Timus 1118. Nontrivial Numbers
- huilIL
- Android Studio之版本管理工具Git (图文教程)
- Android知识梳理之事件传递机制
- Android SDK中tools详解
- 使用com.aspose.words将word模板转为PDF乱码解决方案(window下正常)
- Ioc依赖注入,使你的项目告别findViewById
- SVN clearup 进入死循环
- 洛谷P1313
- C 数列计算问题
- hadoop namenode 启动问题
- 如何下载DB2的license ?