点击view
传递流程
、
MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.e("事件分发机制","MainActivity分发事件");
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("事件分发机制","MainActivity分发事件");
return super.onTouchEvent(event);
}
}
ViewGroup1
/**
* Created by hasee-pc on 2018/6/12.
*/
public class ViewGroup1 extends RelativeLayout {
public ViewGroup1(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.e("事件分发机制","ViewGroup1分发事件");
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.e("事件分发机制","ViewGroup1不拦截事件");
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("事件分发机制","ViewGroup1消费事件");
return super.onTouchEvent(event);
}
}
ViewGroup2
/**
* Created by hasee-pc on 2018/6/12.
*/
public class ViewGroup2 extends RelativeLayout {
public ViewGroup2(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.e("事件分发机制","ViewGroup2分发事件");
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.e("事件分发机制","ViewGroup2不拦截事件");
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("事件分发机制","ViewGroup2消费事件");
return super.onTouchEvent(event);
}
}
MyView
/**
* Created by hasee-pc on 2018/6/12.
*/
public class MyView extends TextView {
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
Log.e("事件分发机制","MyView分发事件");
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("事件分发机制","MyView消费事件");
return super.onTouchEvent(event);
}
}
点击myview的打印结果
ViewGroup怎样通过dispatchTouchEvent方法能把事件分发到自己的onTouchEvent处理呢?return true和false都不行,那么只能通过Interceptor把事件拦截下来给自己的onTouchEvent,所以ViewGroup dispatchTouchEvent方法的super默认实现就是去调用onInterceptTouchEvent.
同样的对于View的dispatchTouchEvent return super.dispatchTouchEvent方法的时候事件会传到哪里呢,view没有拦截器.同样的return true是终结,return false是回溯父类的onTouchEvent,怎么样事件分发给自己的onTouchEvent处理呢?那么只能return super.dispatchTouchEvent,View类的dispatchTouchEvent方法默认实现就是能帮你调用view自己的onTouchEvent方法.
源码解析图: