一.为什么会有事件分发机制
![](https://img.haomeiwen.com/i2103243/9e8c723e08f0ae6e.png)
二.三个重要的事件分发的方法
1.dispatchTouchEvent 决定自己处理还是分发给子view
2.onInterceptTouchEvent 父控件下发 如果子控件需要处理,就会进行拦截
3.onTouchEvent
三.事件分发流程
![](https://img.haomeiwen.com/i2103243/4302038ade6541e3.png)
没有消费 就会依次反转 ,最后没人处理才会浪费掉
![](https://img.haomeiwen.com/i2103243/84c284ad378bc421.png)
伪代码
![](https://img.haomeiwen.com/i2103243/065561ea9d507a9b.png)
例子: ScrollView 中嵌套地图控件MapView ,在MapView 外面添加个父控件MyMapView
public class MyMapView extends FrameLayout {
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
//告诉父类 自己消费这次事件,告诉父组件不要拦截(抢走)这次的事件。
getParent().requestDisallowInterceptTouchEvent(true);
} else if (ev.getAction() == MotionEvent.ACTION_UP) {
getParent().requestDisallowInterceptTouchEvent(false);
}
return super.dispatchTouchEvent(ev);
}
public MyMapView(Context context) {
super(context);
}
public MyMapView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyMapView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
网友评论