OnTouchEvent事件分发机制
Contents
OnTouchEvent的基本认识
- 跟Touch相关的三个方法:
public boolean dispatchTouchEvent(MotionEvent ev); //用来分派event
public boolean onInterceptTouchEvent(MotionEvent ev); //用来拦截event
public boolean onTouchEvent(MotionEvent ev); //用来处理event
onTouch方法优先于onClick方法
只要触摸到了任何一个控件,就一定会调用该控件的dispatchTouchEvent方法
用法:
dispatchTouchEvent() 用来分派事件。 其中调用了onInterceptTouchEvent()和onTouchEvent(),一般不重写该方法
.
onInterceptTouchEvent() 用来拦截事件。 ViewGroup类中的源码实现就是{return false;}表示不拦截该事件, 事件将向下传递(传递给其子View); 若手动重写该方法,使其返回true则表示拦截,事件将终止向下传递, 事件由当前ViewGroup类来处理,就是调用该类的onTouchEvent()方法
.
onTouchEvent() 用来处理事件。 返回true则表示该View能处理该事件,事件将终止向上传递(传递给其父View); 返回false表示不能处理,则把事件传递给其父View的onTouchEvent()方法来处理
简单使用:
例如一个Activity里有一个LinearLayout、一个TextView
在Activity里重写OnTouchEvent 方法,TextView绑定onTouchLister
这样如果TextView重写的onTouch方法里返回了true,Activity里的OnTouchEvent
方法就不再执行。
tvTest.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
Functions.toast(SettingActivity.this, "BTN-------Event");
Logger.log("Erin","btn------event"+motionEvent.getAction());
return true;
}
});
此处可能会调用多次ontouch方法,因为Action可能是按下、松开、移动三种情况。
总结
- android 的分发事件先传递给ViewGroup,再由ViewGroup传给View。
- 只要ViewGroup拦截了事件(onInterceptTouchEvent返回true) 事件就不会在往子View传递。
详细参考