控件事件的相关方法
Activity:disPatchTouchEvent(),onTouchevent()
ViewGroup:disPatchTouchEvent()onInterceptTouchEvent()onTouchEvent()
View:
disPatchTouchEvent(),
onTouchevent()
事件的传递是从Activity传进来,然后走到ViewGroup在到View
先看下图理解传递顺序
代码测试
Activity
@Override public boolean dispatchTouchEvent(MotionEvent ev) { Log.d(TAG, "Activity的dispatchTouchEvent事件"); return super.dispatchTouchEvent(ev);//false和true不向下传递事件,super事件传递 } @Override public boolean onTouchEvent(MotionEvent event) { Log.d(TAG, "Activity的onTouchEvent事件"); return super.onTouchEvent(event); }
ViewGroup
@Override public boolean dispatchTouchEvent(MotionEvent ev) { Log.d(TAG, "(ViewGroup)---dispatchTouchEvent----activity传进来的事件"); return super.dispatchTouchEvent(ev);//设立返回true是消费事件下面的都不会调用,false和super都是事件交给父容器处理 } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.d(TAG,"(ViewGroup)---onInterceptTouchEvent----dispatchTouchEvent传递进来的事件"); return super.onInterceptTouchEvent(ev);//super和false都会把事件向下传递,true的时候才会拦截事件,把事件交给onTouchEvent处理 } @Override public boolean onTouchEvent(MotionEvent event) { Log.d(TAG, "(ViewGroup)---onTouchEvent----只有nInterceptTouchEvent返回true事件才到这里"); return super.onTouchEvent(event);//true事件自己处理掉,就此不在传递,false super都是交给父容器处理 }View
@Override public boolean dispatchTouchEvent(MotionEvent event) { Log.d(TAG, "(View)----------------dispatchTouchEvent事件"); return super.dispatchTouchEvent(event);//true该方法自己处理事件 false事件返回父容器的onTouchEvent处理 super事件交给该view的onTouchEvent处理 } @Override public boolean onTouchEvent(MotionEvent event) { Log.d(TAG, "(View)------------------onTouchEvent事件"); return false;//true自己处理事件,false super事件都会返回父容器的onTouchEvent处理事件 }测试输出结果12-21 02:59:53.546 5465-5465/com.itheima.event D/MainActivity: Activity的dispatchTouchEvent事件 12-21 02:59:53.546 5465-5465/com.itheima.event D/MyViewGroup: (ViewGroup)---dispatchTouchEvent----activity传进来的事件 12-21 02:59:53.546 5465-5465/com.itheima.event D/MyViewGroup: (ViewGroup)---onInterceptTouchEvent----dispatchTouchEvent传递进来的事件 12-21 02:59:53.546 5465-5465/com.itheima.event D/MyButton: (View)----------------dispatchTouchEvent事件 12-21 02:59:53.546 5465-5465/com.itheima.event D/MyButton: (View)------------------onTouchEvent事件 12-21 02:59:53.546 5465-5465/com.itheima.event D/MyViewGroup: (ViewGroup)---onTouchEvent----只有nInterceptTouchEvent返回true事件才到这里 12-21 02:59:53.546 5465-5465/com.itheima.event D/MainActivity: Activity的onTouchEvent事件 12-21 02:59:53.621 5465-5465/com.itheima.event D/MainActivity: Activity的dispatchTouchEvent事件 12-21 02:59:53.621 5465-5465/com.itheima.event D/MainActivity: Activity的onTouchEvent事件