事件分发原理
Android为触摸事件封装了一个类MotionEvent,其实OnTouchEvent的一个参数就是MotionEventMotionEvent中封装了触摸点坐标、点击事件类型等Android中的View可以放在一个ViewGroup中,这个ViewGroup又放在另一ViewGroup中等等,一层层嵌套起来,同一个触摸事件,View和父ViewGroup都想要处理,我们应该传给谁呢,此时就需要事件拦截机制
MotionEvent中处理得事件类型为:
注意:ACTION_MOVE方法会被调用多次,ACTION_CANCEL:当事件被上层拦截时触发,需要掌握拦截的条件
View的继承关系如下:
事件分发和事件处理流程
事件分发:ViewGroup.java--->dispatchTouchEvent
事件处理:View.java->dispatchTouchEvent
先分析处理流程
Onclick与OnTouch的事件冲突的分析:
button = findViewById(R.id.click1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG,"onclick");
}
});
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i(TAG,"onTouch action" + event.getAction());
return false;
}
});
}
返回的结果为:
2020-07-15 11:27:47.174 19712-19712/com.example.clickevent I/ClickTou