Android——View的事件分发机制(学习Android开发艺术探索)
2016-05-19 09:52
537 查看
点击事件的事件分发(其实就是对MotionEvent事件的分发过程),当一个MotionEvent产生以后,系统需要把这个事件传递给某个View,这就是分发过程。
此分发过程主要由三个方法组成:
public boolean dispatchTouchEvent(MotionEvent ev):用于事件的分发,若事件传递给当前的View此方法就会被调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法影响。
public boolean onInterceptTouchEvent(MotionEvent ev):判断是否拦截此事件
public boolean onTouchEvent(MotionEvent ev):用来处理点击事件,返回结果表示是否消耗此事件
三种方法的联系和区别:
伪代码的解释:对于一个ViewGroup,点击事件产生后首先传递给此ViewGroup,调用方法dispatchTouchEvent,如果此ViewGroup的onInterceptTouchEvent返回True则拦截此事件,然后调用onTouchEvent处理此事件;若返回False,则传递给ViewGroup的子View,调用其dispatchTouchEvent方法。
关于onTouchListener 、onTouchEvent 、onClickListener的优先级:
onTouchListener >onTouchEvent >onClickListener
一个View设置onTouchListener,会回调onTouch方法,返回false则onTouchEvent方法调用
点击事件的传递过程:Activity->Window->View
如果一个View的onTouchEvent返回false,则会调用父容器的onTouchEvent,若不处理返回false以此类推,最后调用Activity的onTouchEvent.
注意点:
1.一个事件只能被一个View拦截和消耗
2.某个View决定拦截,那么这一个事件序列只能由他处理,并且它的onInterceptTouchEvent不会再调用
3.某个View一旦开始处理某事件,如果它不消耗ACTION_DOWN事件,那么同一事件序列的其他事件不会在由它处理,并且把事件重新交由父元素处理,即父元素的onTouchEvent方法调用。若View不消耗除ACTION_DOWN以外的其他事件,那么此点击事件会消失,此时父元素的onTouchEvent不会调用,最终这些消失的点击事件交由Activity处理。
4.通过requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的事件分发过程,但是ACTION_DOWN事件除外。
学习来自Android开发艺术探索
此分发过程主要由三个方法组成:
public boolean dispatchTouchEvent(MotionEvent ev):用于事件的分发,若事件传递给当前的View此方法就会被调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法影响。
public boolean onInterceptTouchEvent(MotionEvent ev):判断是否拦截此事件
public boolean onTouchEvent(MotionEvent ev):用来处理点击事件,返回结果表示是否消耗此事件
三种方法的联系和区别:
public boolean dispatchTouchEvent(MotionEvent ev){ boolean consume=false; if(onInterceptTouchEvent(ev)){ consume= onTouchEvent(ev); }else{ consume=child.dispatchTouchEvent(ev); } return resume; }
伪代码的解释:对于一个ViewGroup,点击事件产生后首先传递给此ViewGroup,调用方法dispatchTouchEvent,如果此ViewGroup的onInterceptTouchEvent返回True则拦截此事件,然后调用onTouchEvent处理此事件;若返回False,则传递给ViewGroup的子View,调用其dispatchTouchEvent方法。
关于onTouchListener 、onTouchEvent 、onClickListener的优先级:
onTouchListener >onTouchEvent >onClickListener
一个View设置onTouchListener,会回调onTouch方法,返回false则onTouchEvent方法调用
点击事件的传递过程:Activity->Window->View
如果一个View的onTouchEvent返回false,则会调用父容器的onTouchEvent,若不处理返回false以此类推,最后调用Activity的onTouchEvent.
注意点:
1.一个事件只能被一个View拦截和消耗
2.某个View决定拦截,那么这一个事件序列只能由他处理,并且它的onInterceptTouchEvent不会再调用
3.某个View一旦开始处理某事件,如果它不消耗ACTION_DOWN事件,那么同一事件序列的其他事件不会在由它处理,并且把事件重新交由父元素处理,即父元素的onTouchEvent方法调用。若View不消耗除ACTION_DOWN以外的其他事件,那么此点击事件会消失,此时父元素的onTouchEvent不会调用,最终这些消失的点击事件交由Activity处理。
4.通过requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的事件分发过程,但是ACTION_DOWN事件除外。
学习来自Android开发艺术探索
相关文章推荐
- android studio之jni(上)生成so文件
- Android studio 多渠道打包
- Android Studio右键选项中没有Git?
- Android 蓝牙,wlan调试命令
- 如何解决Android出现的异常“java.lang.NoSuchMethodError: android.widget.LinearLayout.setBackground”?
- android studio2.1创建项目的两个坑
- Android中的坐标
- Android WebView 与JS的数据交互
- 不需要任何权限获得Android设备的唯一ID,权限android设备id
- Android调试02
- 【Android】导入第三方库时,关于so文件的一些思考
- Android Studio如何查看branch列表及切换branch
- 四:资讯列表实现(借助PullToRefres实现上拉和下拉刷新) (下)
- Android点九图注意事项
- Anddroid 图片模糊处理——RenderScript :简单而快速的图像处理
- 在Android上打造属于自己的Rxjava框架(三)操作符变换
- 解决 Android Studio 运行卡的问题
- android AsyncTask介绍
- Android逆向之分析某锁机恶意软件
- 关于Andriod Studio Libs文件不编译