Android中的事件分发机制
Android中的事件分发机制
这篇文章这周之内尽量写完
参考资料:
Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)
1.Android onTouch()事件处理分发中的三个重要方法:
dispatchTouchEvent()
onInterceptTouchEvent()
onTouchEvent()
2.onTouch()事件
onTouch事件包括一个ACTION_DOWN,若干个ACTION_MOVE和一个ACTION_UP等的一系列事件组合。
3.onTouch()函数返回值有什么用
如果我们将返回值改成true,则onTouch()会处理并截获该事件。(截获的意思是指如果我们同时监听onTouch(),和onClick(),而onTouch()截获了该事件,则onClick()将不会被触发)。
4.上面的三个重要方法详细说明
dispatchTouchEvent()处理触摸事件分发,当onTouch()被触发时默认调用该事件,``onInterceptTouchEvent()
中断事件继续分发,在dispatchTouchEvent()`中选择调用
onTouchEvent()接受到事件之后负责处理
View里,有两个回调函数 :
public boolean dispatchTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent ev);
ViewGroup里,有三个回调函数 :
public boolean dispatchTouchEvent(MotionEvent ev);
public boolean onInterceptTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent ev);
在Activity里,有两个回调函数 :
public boolean dispatchTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent ev);

5.看一下dispatchTouchEvent()的源码`
public boolean dispatchTouchEvent(MotionEvent event) {
if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
mOnTouchListener.onTouch(this, event)) {
//onTouch()函数的返回值决定了是直接返回还是调用onTouchEvent进行处理
return true;
}
return onTouchEvent(event);
}
6.onTouchEvent()源码太长了,懒得看,只贴一点重要的东西
public boolean onTouchEvent(MotionEvent event) {
final int viewFlags = mViewFlags;
if ((viewFlags & ENABLED_MASK) == DISABLED) {
return (((viewFlags & CLICKABLE) == CLICKABLE ||
(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE));
}
if (mTouchDelegate != null) {
if (mTouchDelegate.onTouchEvent(event)) {
return true;
}
}
if (((viewFlags & CLICKABLE) == CLICKABLE ||
(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
//switch里面就是onTouch()触发的四个事件
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
...
case MotionEvent.ACTION_DOWN:
...
case MotionEvent.ACTION_CANCEL:
...
case MotionEvent.ACTION_MOVE:
...
}
return true;
}
return false;
}

浙公网安备 33010602011771号