Android的触摸事件分发是从最上层的Activity开始的,然后dispatch到子View,当分发到触发事件的View时,再逐层往回调用onTouchEvent函数,下面是实例代码。(有空还要更彻底的研究下源码)
1 public class DispatchActivity extends Activity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 7 View disView = new DispatchView(this); 8 LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT, 9 LayoutParams.FILL_PARENT);10 setContentView(disView, lp);11 }12 13 @Override14 public boolean onTouchEvent(MotionEvent event) {15 if (event.getAction() == MotionEvent.ACTION_DOWN) {16 Log.i("()()", "Parent onTouchEvent Down!!!!!!!!!!!!!!!!");17 }18 return super.onTouchEvent(event);19 }20 21 @Override22 public boolean dispatchTouchEvent(MotionEvent ev) {23 if (ev.getAction() == MotionEvent.ACTION_DOWN) {24 Log.i("()()", "Parent dispatchTouchEvent Down????????????????");25 }26 return super.dispatchTouchEvent(ev);27 }28 29 public class DispatchView extends View {30 31 private Paint paint = new Paint();32 33 public DispatchView(Context context) {34 super(context);35 paint.setColor(Color.RED);36 }37 38 @Override39 public boolean dispatchTouchEvent(MotionEvent event) {40 if (event.getAction() == MotionEvent.ACTION_DOWN) {41 Log.i("()()", "Child dispatchTouchEvent Down#############");42 paint.setColor(Color.BLUE);43 invalidate();44 }45 return super.dispatchTouchEvent(event);46 }47 48 @Override49 public boolean onTouchEvent(MotionEvent event) {50 if (event.getAction() == MotionEvent.ACTION_DOWN) {51 Log.i("()()", "Child onTouchEvent Down*****************");52 paint.setColor(Color.GREEN);53 invalidate();54 }55 return super.onTouchEvent(event);56 }57 58 @Override59 protected void onDraw(Canvas canvas) {60 canvas.drawRect(30, 30, 300, 300, paint);61 super.onDraw(canvas);62 }63 64 }65 66 }
实例效果如下:
当点击红色的View时,log如下:
如果Child View设置了OnClickListener,那么和在Child View的onTouchEvent函数中返回True是一个效果,也就是此事件不再向上传播。