android事件机制
2016-06-15 00:00
309 查看
android系统的事件机制主要由boolean dispatchTouchEvent(MotionEvent event)和boolean onTouchEvent(MotionEvent event)实现。
对于View而言,事件的分发流程:dispatchTouchEvent---------->onTouch(如果设置了View的onTouchListener)------------>onTouchEvent----------->各种事件(如单击事件等等)。
首先以一个Button为例分析事件流程,给button设置OnClickListener和onTouchListener当我们点击按钮的时候会发现首先执行的是onTouchListener然后是onClickListener,并且是在ACTION_UP事件执行完成后执行的onClickListener,如果onTouchListener返回true,表明它要自己消费事件,onClickListener就不会被执行;
我们再自定义一个MyButton继承自系统的Button,并且实现onTouchEvent方法,点击按钮时发现如果onTouchListener返回true的话,onTouchEvent是不会执行的,和上述一样,它自己消费,由于OnClickListener是在onTouchEvent被执行的,所有也不会触发。这些事件的控制,其实都源于dispatchTouchEvent方法,这个方法控制的事件的分发与执行。查看dispatchTouchEvent发现只有当该View是enable才可以触发事件:源码如下:
boolean result = false;
if(li!=null && li.onTouchListener != null && (mViewFlags & ENABLE_MASK) == ENABLE && li.onTouchListener.onTouch(this,event)){
result = true;
}
if(!result && onTouchEvent(this,event)){
result = true;
}
其中(mViewFlags&ENABLE_MASK) == ENABLE是判断当前控件是否能enable,如果为false,onTouchListener不会执行,但是onTouchEvent会继续执行,但是里面的onClickListener就不会继续执行了。如果dispatchTouchEvent返回false,则下一个事件就不会被分发了(如在ACTION_DOWN返回false,那么ACTION_MOVE和ACTION_UP就不会执行),onTouchEvent返回值也是如此.
对于ViewGroup要多一个方法boolean onInterceptTouchEvent(MotionEvent event);
dispatchTouchEvent---->onInterceptTouchEvent(如果返回false交给子view的dispatchTouchEvent,如果返回true,则表示拦截事件,交由自己的onTouchEvent处理)余下处理和VIew一样
对于View而言,事件的分发流程:dispatchTouchEvent---------->onTouch(如果设置了View的onTouchListener)------------>onTouchEvent----------->各种事件(如单击事件等等)。
首先以一个Button为例分析事件流程,给button设置OnClickListener和onTouchListener当我们点击按钮的时候会发现首先执行的是onTouchListener然后是onClickListener,并且是在ACTION_UP事件执行完成后执行的onClickListener,如果onTouchListener返回true,表明它要自己消费事件,onClickListener就不会被执行;
我们再自定义一个MyButton继承自系统的Button,并且实现onTouchEvent方法,点击按钮时发现如果onTouchListener返回true的话,onTouchEvent是不会执行的,和上述一样,它自己消费,由于OnClickListener是在onTouchEvent被执行的,所有也不会触发。这些事件的控制,其实都源于dispatchTouchEvent方法,这个方法控制的事件的分发与执行。查看dispatchTouchEvent发现只有当该View是enable才可以触发事件:源码如下:
boolean result = false;
if(li!=null && li.onTouchListener != null && (mViewFlags & ENABLE_MASK) == ENABLE && li.onTouchListener.onTouch(this,event)){
result = true;
}
if(!result && onTouchEvent(this,event)){
result = true;
}
其中(mViewFlags&ENABLE_MASK) == ENABLE是判断当前控件是否能enable,如果为false,onTouchListener不会执行,但是onTouchEvent会继续执行,但是里面的onClickListener就不会继续执行了。如果dispatchTouchEvent返回false,则下一个事件就不会被分发了(如在ACTION_DOWN返回false,那么ACTION_MOVE和ACTION_UP就不会执行),onTouchEvent返回值也是如此.
对于ViewGroup要多一个方法boolean onInterceptTouchEvent(MotionEvent event);
dispatchTouchEvent---->onInterceptTouchEvent(如果返回false交给子view的dispatchTouchEvent,如果返回true,则表示拦截事件,交由自己的onTouchEvent处理)余下处理和VIew一样
相关文章推荐
- 地图应用开发(android)使用百度地图sdk详解+案例附源码
- 采用LRU算法的MemoryCache缓存实现
- android 触摸事件分析
- Windows环境下Android Studio v1.0安装教程、百度云下载Android Studio
- android 屏幕适配实用的
- Android 服务绑定与数据同步
- Fragment Home键返回桌面再打开程序,无法开启
- android发送邮件
- Android Intent意图的常用使用方法
- android控件按下时出现黄色背景
- Android ORMLite 框架的入门用法
- 一个老鸟发的公司内部整理的 Android 学习路线图 Markdown 版本
- Android的接口回调
- android资料网址多媒体播放,编解码。
- Android性能优化之布局优化
- TextView的一些应用(Textview 自定义字体、显示多种颜色、添加阴影)
- android——数据存储SQLite
- Android数据库之ormlite简单使用
- 避免Android中Context引起的内存泄露
- 【转】Android - Button(按钮)的响应点击事件的4种写法