知识点
事件分发,拦截与消费
类型 | 相关方法 | Activity | ViewGroup | View |
---|---|---|---|---|
事件分发 | dispatchTouchEvent | √ | √ | √ |
事件拦截 | onInterceptTouchEvent | × | √ | × |
事件消费 | onTouchEvent | √ | × | √ |
例如:
同一button 同时接受Click 事件和Touch 事件,Touch 事件返回false
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG,"onClick");
}
});
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d(TAG,"onTouch: "+event);
return false;
}
});
输出:OnTouch 返回的是false,所以两个事件都会接受
onTouch: MotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=79.0, y[0]=86.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=12617717, downTime=12617717, deviceId=6, source=0x1002 }
onTouch: MotionEvent { action=ACTION_UP, actionButton=0, id[0]=0, x[0]=79.0, y[0]=86.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=12617799, downTime=12617717, deviceId=6, source=0x1002 }
onClick
将Touch 事件返回值改为true
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d(TAG,"onTouch: "+event);
return true;
}
});
不会再处理onClick 事件
输出:
onTouch: MotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=104.0, y[0]=71.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=12826790, downTime=12826790, deviceId=6, source=0x1002 }
onTouch: MotionEvent { action=ACTION_UP, actionButton=0, id[0]=0, x[0]=104.0, y[0]=71.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=12826890, downTime=12826790, deviceId=6, source=0x1002 }