关于view的Touch事件、关于ViewGroup的touch事件
View的触摸事件:
dispatchTouchEvent、onTouchEvent、setOnTouchListener
onTouch()和onTouchEvent的区别:
- onTouch()是View提供给用户,让用户自己处理触摸事件的接口。而onTouchEvent()是Android系统自己实现的接口。
- onTouch()的优先级比onTouchEvent()的优先级更高。dispatchTouchEvent()中分发事件的时候,会先将事件分配给onTouch()进行处理,然后才分配给onTouchEvent()进行处理。
- 如果onTouch()对触摸事件进行了处理,并且返回true;那么,该触摸事件就不会分配在分配给onTouchEvent()进行处理了。只有当onTouch()没有处理,或者处理了但返回false时,才会分配给onTouchEvent()进行处理。
传递流程:
- Android事件分发是先传递到ViewGroup,再由ViewGroup传递到View的。
- 在ViewGroup中可以通过onInterceptTouchEvent方法对事件传递进行拦截,onInterceptTouchEvent方法返回true代表不允许事件继续向子View传递,返回false代表不对事件进行拦截,默认返回false。
- 子View中如果将传递的事件消费掉,ViewGroup中将无法接收到任何事件。
好了,Android事件分发机制完全解析到此全部结束,结合上下两篇,相信大家对事件分发的理解已经非常深刻了。
简单来说就是传递的时候用父视图往子视图传递,中间如果某一层视图的onInterceptTouchEvent返回true,那么就不会接着往下传递,然后开始响应流程,从子视图往父视图传递,如果中间某一层消费了这个事件,那么父视图就不会接收到这个事件。
涉及到的API:
MotionEvent : 触屏事件
- int ACTION_DOWN=0 : 代表down
- Int ACTION_MOVE=2 ; 代表move
- Int ACTION_UP=1 : 代表up
- getAction() : 得到事件类型值
- getX() : 得到事件发生的x轴坐标(相对于当前视图)
- getRawX() :得到事件发生的x轴坐标(相对于屏幕左顶点)
- getY() : 得到事件发生的y轴坐标(相对于当前视图)
- getRawY() :得到事件发生的y轴坐标(相对于屏幕左顶点)
Activity
- boolean dispatchTouchEvent(MotionEvent event) : 分发事件
- boolean onTouchEvent(MotionEvent event) : 处理事件的回调
View
- boolean dispatchTouchEvent(MotionEvent event) : 分发事件
- boolean onTouchEvent(MotionEvent event) : 处理事件的回调方法
- void setOnTouchListener(OnTouchListener l) : 设置事件监听器
- void setOnClickListener(OnClickListener l) : 设置点击监听
- void setOnLongClickListener(OnLongClickListener l) : 设置长按监听
- void setOnCreateContextMenuListener(OnCreateContextMenuListener l):用于创建菜单
ViewGroup
- boolean dispatchTouchEvent(MotionEvent ev) : 分发事件
- boolean onInterceptTouchEvent(MotionEvent ev) : 拦截事件的回调方法