浅谈Android事件分发机制
2017-08-06 09:44
495 查看
在Android实际开发过程中经常会遇到View之间的滑动冲突,如ScrollView与Listview、RecyclerView之间的嵌套使用。在很好的解决此类问题之前,我们应深入的了解Android事件响应机制。
1.1 onTouch是优先于onClick执行,事件传递的顺序是先经过onTouch,再传递到onClick。
1.2 Android中的事件onClick、onLongClick、onScroll等,都是由多个Touch事件(一个ACTION_DOWN,多个ACTION_MOVE,一个ACTION_UP)组成。
1.3 Android事件响应机制是“由外到内”分发、“由内到外”处理的形式实现的。
1.4 MotionEvent对象的四种状态
MotionEvent.ACTION_DOWN:手指按下屏幕的瞬间。
MotionEvent.ACTION_MOVE:手指在屏幕上移动
MotionEvent.ACTION_UP:手指离开屏幕瞬间
MotionEvent.ACTION_CANCEL:取消手势
2.1 事件分发:public boolean dispatchTouchEvent(MotionEvent ev)
当监听到有触发事件时,首先由Activity进行捕获,然后事件就进入事件分发的流程。Activity本身没有事件拦截,从而将事件传递给最外层的View的dispatchTouchEvent(MotionEvent ev)方法,该方法将对事件进行分发。
return true : View消费所有事件。
return false :停止分发,交由上层控件的onTouchEvent方法进行消费,如果本层控件是Activity,那么事件将被系统消费、处理。
super.dispatchTouchEvent(ev): 将事件交由本层的事件拦截onInterceptTouchEvent方法处理。
2.2 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
return true: 对事件拦截,交由本层的onTouchEvent进行处理。
return false: 不拦截,分发到子View,由子View的dispatchTouchEvent方法处理。
super.onInterceptTouchEvent(ev):默认表示事件拦截,交由本层的onTouchEvent进行处理。
2.3 事件响应:public boolean onTouchEvent(MotionEvent ev)
return true: 表示onTouchEvent处理完事件后消费了此次事件。
return false: 不响应事件,不断的传递给上层的onTouchEvent方法处理,直到某个View的onTouchEvent返回true,则认为该事件被消费。如果到最顶层View还是返回false,那么该事件不消费,将交由Activity的onTouchEvent进行处理。
return: super.onTouchEvent,不响应事件,结果与return返回false一样。
综上所述,我们可以总结出如下流程图:
结合上面的理解,我们再来看看Touch事件传递机制流程图
ViewGroup默认不拦截任何事件。
点击事件的分发过程如下:dispatchTouchEvent—>onTouchListener的OnTouch方法—>onTouchEvent—>onClickListener的onClick方法。从而也可以看出onTouch优先于onClick执行。
子View可以通过使用getParent().requestDisallowInterceptTouchEvent(true),阻止ViewGroup对其MOVE或UP事件进行拦截。
一个点击事件产生后,传递过程是:Activity—>Window—>View。顶级View接受到事件后,就会按照上面的规则去分发事件。
好了,本文到此结束。以上仅是个人对Android事件分发机制的粗略理解,如有不足之处,还望指正。如果大家想进一步的结合源码深入了解,建议大家可以再看看郭霖的这篇文章http://blog.csdn.net/guolin_blog/article/details/9097463/
1.事件响应机制的预备知识
在深入了解Android事件响应机制前,一些预备知识我们应该有所了解。1.1 onTouch是优先于onClick执行,事件传递的顺序是先经过onTouch,再传递到onClick。
1.2 Android中的事件onClick、onLongClick、onScroll等,都是由多个Touch事件(一个ACTION_DOWN,多个ACTION_MOVE,一个ACTION_UP)组成。
1.3 Android事件响应机制是“由外到内”分发、“由内到外”处理的形式实现的。
1.4 MotionEvent对象的四种状态
MotionEvent.ACTION_DOWN:手指按下屏幕的瞬间。
MotionEvent.ACTION_MOVE:手指在屏幕上移动
MotionEvent.ACTION_UP:手指离开屏幕瞬间
MotionEvent.ACTION_CANCEL:取消手势
2.Android事件处理的三个重要函数
Android事件分发机制主要由“事件分发”—>“事件拦截”—>“事件响应”这三步来进行逻辑控制的。本文也将从这三步对应的函数来分析。2.1 事件分发:public boolean dispatchTouchEvent(MotionEvent ev)
当监听到有触发事件时,首先由Activity进行捕获,然后事件就进入事件分发的流程。Activity本身没有事件拦截,从而将事件传递给最外层的View的dispatchTouchEvent(MotionEvent ev)方法,该方法将对事件进行分发。
return true : View消费所有事件。
return false :停止分发,交由上层控件的onTouchEvent方法进行消费,如果本层控件是Activity,那么事件将被系统消费、处理。
super.dispatchTouchEvent(ev): 将事件交由本层的事件拦截onInterceptTouchEvent方法处理。
2.2 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
return true: 对事件拦截,交由本层的onTouchEvent进行处理。
return false: 不拦截,分发到子View,由子View的dispatchTouchEvent方法处理。
super.onInterceptTouchEvent(ev):默认表示事件拦截,交由本层的onTouchEvent进行处理。
2.3 事件响应:public boolean onTouchEvent(MotionEvent ev)
return true: 表示onTouchEvent处理完事件后消费了此次事件。
return false: 不响应事件,不断的传递给上层的onTouchEvent方法处理,直到某个View的onTouchEvent返回true,则认为该事件被消费。如果到最顶层View还是返回false,那么该事件不消费,将交由Activity的onTouchEvent进行处理。
return: super.onTouchEvent,不响应事件,结果与return返回false一样。
综上所述,我们可以总结出如下流程图:
结合上面的理解,我们再来看看Touch事件传递机制流程图
3. 总结
通过上面的叙述,相信大家对Android的分发机制有了初步的理解。为了加深大家的理解,下面做个简单的总结。ViewGroup默认不拦截任何事件。
点击事件的分发过程如下:dispatchTouchEvent—>onTouchListener的OnTouch方法—>onTouchEvent—>onClickListener的onClick方法。从而也可以看出onTouch优先于onClick执行。
子View可以通过使用getParent().requestDisallowInterceptTouchEvent(true),阻止ViewGroup对其MOVE或UP事件进行拦截。
一个点击事件产生后,传递过程是:Activity—>Window—>View。顶级View接受到事件后,就会按照上面的规则去分发事件。
好了,本文到此结束。以上仅是个人对Android事件分发机制的粗略理解,如有不足之处,还望指正。如果大家想进一步的结合源码深入了解,建议大家可以再看看郭霖的这篇文章http://blog.csdn.net/guolin_blog/article/details/9097463/
相关文章推荐
- Android——浅谈事件分发机制
- 浅谈Android 的事件分发机制
- Android面试补习(六)浅谈Android事件分发机制(对CSDN移动端的填坑意见反馈)
- 浅谈android事件分发机制
- 浅谈Android事件分发机制(一)点击事件的传递规则
- 浅谈android的事件分发机制
- 浅谈android view事件分发机制
- 浅谈Android 触摸事件分发机制
- Android事件分发机制完全解析,带你从源码的角度彻底理解dispatchTouchEvent,onInterceptTouchEvent
- Android的Touch事件分发机制简单分析
- android之事件分发机制
- Android触摸事件分发机制详解
- Android事件分发机制简记
- Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
- Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
- Android事件分发机制二
- Android开发-事件分发机制实验分析ViewGroup、View事件分发,结合职责链模式
- Android——View事件分发机制
- Android View的事件分发机制
- Android事件分发拦截机制(图解)