Android MotionEvent 事件解读

Android在MotionEvent里定义了一系列的手势事件

 

其中包括:

MotionEvent.ACTION_DOWN:当屏幕检测到第一个触点按下之后就会触发到这个事件。

MotionEvent.ACTION_MOVE:当触点在屏幕上移动时触发,触点在屏幕上停留也是会触发的,主要是由于它的灵敏度很高,而我们的手指又不可能完全静止(即使我们感觉不到移动,但其实我们的手指也在不停地抖动)。

MotionEvent.ACTION_POINTER_DOWN:当屏幕上已经有触点处于按下的状态的时候,再有新的触点被按下时触发。

MotionEvent.ACTION_POINTER_UP:当屏幕上有多个点被按住,松开其中一个点时触发(即非最后一个点被放开时)触发。

MotionEvent.ACTION_UP:当最后一个触点松开时被触发。

MotionEvent.ACTION_SCROLL:非触摸滚动,主要是由鼠标、滚轮、轨迹球触发。

MotionEvent.ACTION_CANCEL:不是由用户直接触发,有系统再需要的时候触发,例如当父view通过使函数onInterceptTouchEvent()返回true,从子view拿回处理事件的控制权是,就会给子view发一个ACTION_CANCEL事件,这里了view就再也不会收到事件了。可以将其视为ACTION_UP事件对待。

 

onInterceptTouchEvent()函数与onTouchEvent()的区别:


1、onInterceptTouchEvent()是用于处理事件(类似于预处理,当然也可以不处理)并改变事件的传递方向,也就是决定是否允许Touch事件继续向下(子view)传递,一但返回True(代表事件在当前的viewGroup中会被处理),则向下传递之路被截断(所有子view将没有机会参与Touch事件),同时把事件传递给当前的view的onTouchEvent()处理;返回false,则把事件交给子view的onInterceptTouchEvent()


2、onTouchEvent()用于处理事件,返回值决定当前view是否消费(consume)了这个事件,也就是说在当前view在处理完Touch事件后,是否还允许Touch事件继续向上(父view)传递,一但返回True,则父view不用操心自己来处理Touch事件。返回true,则向上传递给父view(注:可能你会觉得是否消费了有关系吗,反正我已经针对事件编写了处理代码?答案是有区别!比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。)

posted @ 2014-08-04 13:59  尽人事以听天命  阅读(4758)  评论(0编辑  收藏  举报