onInterceptTouchEvent()
public boolean onInterceptTouchEvent (MotionEvent ev)
onInterceptTouchEvent()是ViewGroup的方法。他主要用于处理触摸事件并改变事件的传递方向。
参数
MotionEvent ev:
常见的动作常量:
内容 | 解释 |
---|---|
public static final int ACTION_DOWN= 0 | 单点触摸动作,即有个手指触摸到了屏幕上 |
public static final int ACTION_UP= 1 | 单点触摸离开动作,即触摸到屏幕的手指(只有一个)离开 |
public static final int ACTION_MOVE= 2 | 触摸点移动动作,即有一个手指在屏幕上滑动 |
public static final int ACTION_CANCEL= 3 | 触摸动作取消 |
public static final int ACTION_OUTSIDE= 4 | 触摸动作超出边界 |
public static final int ACTION_POINTER_DOWN= 5 | 多点触摸动作,即有了第二个手指或者更多的手指放到了屏幕上 |
public static final int ACTION_POINTER_UP= 6 | 多点离开动作,即有一个手指离开了屏幕,但屏幕上至少还有一个手指 |
。
。
注意事项:move事件,up事件,cancel事件发生的前提是一定发生了action_down事件,若没有消费action_down事件,则action_move,action_up等事件都不会被捕获。
返回值
onInterceptTouchEvent()的返回值为boolean型,当返回值为true时,表示事件会在当前的ViewGroup中处理,并截断事件使得事件不往下传递。同时把事件传递给当前的控件的onTouchEvent()去处理。
onTouchEvent()
public boolean onTouchEvent (MotionEvent ev)
参数
参数和onInterceptTouchEvent()相同,此处不做赘述
返回值
onTouchEvent是View的方法,ViewGroup继承View,所以也能使用该方法。他和onInterceptTouchEvent()有些相似,都是处理触摸事件并改变事件的传递方向。我们在这里着重对比onTouchEvent和onInterceptTouchEvent的不同点:
- 传递方向不同:
- onInterceptTouchEvent() 根据返回值不同将事件传递给子控件的dispatchTouchEvent()或者当前控件的onTouchEvent().当onInterceptTouchEvent()返回true时,表示当前控件要拦截并消费掉这个事件,即将事件传递给当前控件的onTouchEvent()去处理。当反悔false时,表示当前控件将事件交给子控件处理,由子控件的dispatchTouchEvent()接收。
- onTouchEvent()根据返回值不同将事件传递给父控件或者自己消费掉。当返回值为true时,表示这个事件要被当前控件消费掉,事件传递中止。当返回值为false时,表示这个事件会传递给父控件,由父控件的onTouchEvent()接收。
- 数据来源不同:
- onInterceptTouchEvent()接收到的事件是当前控件的dispatchTouchEvent()分配的。
- onTouchEvent()接收到的事件是当前控件的onInterceptTouchEvent()传递过来的(当onInterceptTouchEvent的返回值是true时)或者子控件的onTouchEvent()传递过来(当子控件的onTouchEvent返回值为false时)。