View事件传递
/ / 点击 /- MotionEvent
MotionEvent是View的动作事件参数,包含集中常见的时间类型:
- ACTION_DOWN:手指刚接触到屏幕时;
- ACTION_MOVE:手指在屏幕上移动;
- ACTION_UP:手指从屏幕上离开的瞬间;
MotionEvent的两组位置方式:
getX()/getY():表示动作相对于View左上角位置的x、y坐标;
getRawX()/getRawY():表示动作相对于屏幕左上角位置的x、y坐标;
- 事件分发
public boolean dispatchTouchEvent(MotionEvent event)
用于事件的分发,如果时间传递到了当前的View,那么该方法一定会被调用,boolean类型的返回值受View的onTouchEvent(MotionEvent event)和其子View的dispatchTouchEvent(MotionEvnet event)的影响,返回true表示消耗当前时间。public boolean onInterceptTouchEvent(MotionEvent event)
用来判断是否拦截当前事件,返回结果表示是否拦截当前事件。public boolean onTouchEvent(MotionEvent event)
在dispatchTouchEvent方法中被调用,用来处理touch事件,返回结果表示是否消耗当前事件。
说明:
- 一个事件序列表示手指从接触屏幕(ACTION_DOWN)经历一些列动作事件到手指刚离开屏幕(ACTION_UP)。
- 某个View拦截事件,那么接下来的一个事件序列都有它来处理(时间能到到达的情况下),并且它的onIntercept不会再被调用。
- 如果View再处理事件过程中,不再消耗ACTION_DOWN事件(onTouch返回false),那么事件序列的其他事件将会被其父元素进行消耗。
- ViewGroup默认不拦截事件。
- VIew没有onInterveptTouchEvent方法,View默认的onTouchEvent都会消耗事件(默认返回true)。
- 事件传递是由外向内的,即事件总是先传递给父元素,然后通过父元素分发给子View,通过requestDisallowInterceptTouchEvnet方法来干预父元素的事件分发过程,但是ACTION_DOWN事件除外。
全文完。