点击事件的相关方法
在开发App的过程中,我们或多或少需要对点击事件进行处理。而为达到这一目的,通常需要对以下一个或者几个方法进行重载:
- OnClickListener.onClick(view):void
- OnTouchListener.onTouch(view,event):boolean
- View.onTouchEvent(event):boolean
- ViewGroup.dispatchTouchEvent(event):boolean
- ViewGroup.onInterceptTouchEvent(event):boolean
方法之间调用关系
时序图:
说明:
- 接收到点击事件后,会先调用ViewGroup.dispatchTouchEvent()来派发点击事件;
- 而后,先检索能接受
点击事件
的Child View, 即newTouchTarget
; - 如果
newTouchTarget
不为空,即有接收点击事件的子View,则调用ViewGroup.dispatchTransformedTouchEvent()
,dispatchTransformedTouchEvent
会嵌套调用ViewGroup.dispatchTouchEvent
方法,并将child.dispatchTouchEvent
的返回结果(Boolean型)作为dispatchTranformedTouchEvent
的返回结果,如果dispatchTransformedTouchEvent
返回true,则设置mFirstTouchTarget
; - 如果
mFirstTouchTarget
为空,即点击事件没有子View消费掉。则调用View.dispatchTouchEvent
View.dispatchTouchEvent
会调用onTouch- 如果onTouch返回false,则会调用
View.onTouchEvent
- 在
View.onTouchEvent
中,ACTION_UP
动作时,则会调用onClick
关系图
鱼骨图
注意事项
- 如果只是简单的响应点击事件,
onClick
就可以满足需求,如果点击按钮等; - 如果要响应View中的某个区域的点击事件,
onTouch
可以满足需求 - 如果拖动View,需要重载
onTouchEvent
; - 如果要拦截View的点击事件,需要重载
onInterceptTouchEvent
和onTouchEvent
;
例子
待续
源码
OnClickListener
/**
* Interface definition for a callback to be invoked when
* a view is clicked.
*/
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
OnTouchListener
/**
* Interface definition for a callback to be invoked when
* a touch event is dispatched to this view.
* The callback will be invoked before the touch
* event is given to the view.
*/
public interface OnTouchListener {
/**
* Called when a touch event is dispatched to a view.
* This allows listeners to get a chance to respond
* before the target view.
*
* @param v The view the touch event has been
* dispatched to.
* @param event The MotionEvent object containing full
* information about the event.
* @return True if the listener has consumed the event,
* false otherwise.
*/
boolean onTouch(View v, MotionEvent event);
}
onTouchEvent
在线查看onTouchEvent(event)方法的源码
dispatchTouchEvent
在线查看dispatchTouchEvent(event)的源码
onInterceptTouchEvent
在线查看onInterceptTouchEvent(event)的源码