Activity–>ViewGroup–>view
当我们点击一个Button的时候,事件其实是从Activity–>Layout–>button进行传递的,在传递的过程中可以对事件进行拦截、分发和消费。
默认返回值super是一种隧道回传机制,对事件不进行拦截
返回值是true表示当前view自己消费掉
返回值是false表示当前view不消费,回传到上一级
public class MyLinearLayout extends LinearLayout {
public MyLinearLayout(Context context) {
super(context);
}
public MyLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
System.out.println("MyLinearLayout.dispatchTouchEvent");
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
System.out.println("MyLinearLayout.onInterceptTouchEvent");
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.println("MyLinearLayout.onTouchEvent");
return super.onTouchEvent(event);
}
}
Touch 事件相关方法 方法功能 ViewGroup View Activity
public boolean dispatchTouchEvent(MotionEvent ev) 事件分发 Yes Yes Yes
public boolean onInterceptTouchEvent(MotionEvent ev) 事件拦截 Yes Yes No
public boolean onTouchEvent(MotionEvent ev) 事件响应 Yes Yes Yes
实战演练:
集成百度地图后,需要对标记Marker的位置进行点击调转到百度地图导航,结果点击事件就是不好用
经核实:
事件被MapView给消费掉了
解决:
在MapView的外层套一层布局,在父布局进行事件拦截
public class MyLL extends LinearLayout {
public MyLL(Context context) {
super(context);
}
public MyLL(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public MyLL(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return true;
}
}