Android事件分发机制初探

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     @Override
14     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     @Override
22     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         @Override
39         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         @Override
49         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         @Override
59         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是一个效果,也就是此事件不再向上传播。

 

 



posted @ 2012-07-04 10:17  周柯文  阅读(5244)  评论(0编辑  收藏  举报