MotionEvent
在手指接触屏幕后所产生的一系列事件中,典型的事件类型有如下几种:
●ACTION_DOWN——手指刚接触屏幕;
●ACTION_MOVE——手指在屏幕上移动;
●ACTION_UP——手指从屏幕上松开的一瞬间;
触摸屏幕触发的一系列点击事件:
●点击屏幕后松开,事件序列为:DOWN->UP;
●点击屏幕滑动一会在松开,事件序列为:DOWN->MOVE->...->MOVE->UP;
MotionEvent提供两组方法:getX/getY和getRawX/getRawY
●getX/getY——返回的是相对于当前View左上角的x和y坐标;
●getRawX/getRawY——返回的是相对于手机屏幕左上角的x和y坐标;
点击事件的传递规则
所谓点击事件的事件分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,而这个传递的过程就是分发过程。点击事件的分发过程由三个很重要的方法来共同完成:dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent。
public boolean dispatchTouchEvent(MotionEvent ev)
用来进行事件的分发。如果时间能够传递给当前View,那么此方法一定会被调用,返回结果收当前View的onTouchEvent和下级View的dispatchTouchEvent方法的影响,像是是否消耗当前事件。
public boolean onInterceptTouchEvent(MotionEvent ev)
在dispatchTouchEvent方法内调用,用来判断是否拦截某个事件,如果当前View拦截了某个事件,那么在同一个事件序列中,此方法不会被再次调用,返回结果表示是否拦截当前事件。
public boolean onTouchEvent (MotionEvent ev)
在dispatchTouchEvent方法内调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一事件序列中,当前View无法再次接收到事件。
他们的关系可以用下面的伪代码表示:
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean consume = false;
if (onInterceptTouchEvent (ev)) {
consume = onTouchEvent(ev);
} else {
consume = child.dispatchTouchEvent(ev);
}
return consume;
}
当一个View需要处理事件时,其方法优先级为:onTouchListener>onTouchEvent>onClickListener;
当一个点击事件产生后,传递过程遵循如下顺序:Activity> Window>View;