@946898963
2020-01-06T15:35:19.000000Z
字数 2005
阅读 829
Android绘图
下面一段伪代码展示了点击事件的传递规则:
public boolean dispatchTouchEvent (MotionEvent ev){
boolean consume = false;
if (onInterceptTouchEvnet(ev){
consume = onTouchEvent(ev);
} else {
consume = child.dispatchTouchEnvet(ev);
}
return consume;
}
上面代码主要涉及到以下三个方法:
public boolean dispatchTouchEvent(MotionEvent ev)
这个方法用来进行事件的分发,返回结果表示是否消耗事件。返回结果受onTouchEvent和下级View的dispatchTouchEvent影响。
public boolean onInterceptTouchEvent(MotionEvent ev)
这个方法用来判断是否拦截事件,返回结果表示是否拦截事件。如果当前View拦截了事件,那么在同一个事件序列中,当前方法不会被调用。
public boolean onTouchEvent(MotionEvent ev)
这个方法用来处理点击事件,返回结果表示是否消耗这个点击事件,返回true表示消耗,返回false,表示不消耗,如果不消耗,则在同一个事件序列中,当前的View无法在此接收到事件。
点击事件的传递规则:对于一个根ViewGroup,点击事件产生后,首先会传递给他,这时候就会调用他的dispatchTouchEvent方法,如果Viewgroup的onInterceptTouchEvent方法返回true表示他要拦截事件,接下来事件就会交给ViewGroup处理,调用ViewGroup的onTouchEvent方法;如果ViewGroup的onInteceptTouchEvent方法返回值为false,表示ViewGroup不拦截该事件,这时事件就传递给他的子View,接下来调用子View的dispatchTouchEvent方法,如此反复直到事件被最终处理。
当一个View需要处理事件时,如果它设置了OnTouchListener,那么他的OnTouchListener的onTouch方法会被调用,如果onTouch返回false,则当前View的onTouchEvent方法会被调用,如果onTouch返回true则当前View的onTouchEvent方法不会被调用。在onTouchEvent方法中,如果当前设置的有OnClickListener,那么他的onClick方法会被调用,可以看出,平时我们常用的OnClickListener的优先级最低,处于事件传递体系的末尾。由此可见处理事件时的优先级关系: onTouchListener > onTouchEvent > onClickListener。
关于事件传递的机制,这里给出一些结论: