Android touch事件分发与总结
2016-02-16 23:24
549 查看
逻辑如图
如果最外面的视图OntouchEvent返回flase 则上个视图的OntouchEvent接收到OnTouch事件除非有click方法默认拦截。
onInterceptTouchEvent返回true,则调用layout onTouchEvent方法
如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。 比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。
时序如下
Activity的dispatchTouchEventActivity的onUserInteraction
Layout的dispatchTouchEvent
Layout的onInterceptTouchEvent
Button的onTouchEvent (ACTION_DOWN)
Layout的onTouchEvent (ACTION_DOWN)
紧跟着是一个ACTION_UP事件
Activity的dispatchTouchEvent(不触发Activity的onUserInteraction,它对ACTION_UP不起作用。)
Layout的dispatchTouchEvent
Layout的onInterceptTouchEvent
Button的onTouchEvent
onClick事件不再发生。
点击事件
在ACTION_UP时调用。如果继承button,在OntouchEvent里没有调用父类方法,则click方法不会被调用。事件分发
dispatchTouchEvent事件派发是传递的,如果返回值为false将停止下次事件派发,如果返回true将继续下次派发。譬如,当前派发down事件,如果返回true则继续派发up,如果返回false派发完down就停止了总结
触摸控件(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方法。
当oninterceptTouchEvent返回true时 ,事件当然传递给当前view的onTouchEvent事件,然后 (move,up等)方法不会调用oninterceptTouchEvent方法,因为只会进行一次判断,详细机制请自行参见源码。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories