您的位置:首页 > 移动开发 > Android开发

Android 事件分发机制

2013-06-27 16:24 435 查看
Android的触摸事件分发是从最上层的Activity开始的,然后dispatch到子View,当分发到触发事件的View时,再逐层往回调用onTouchEvent函数,下面是实例代码。(有空还要更彻底的研究下源码)

public class DispatchActivity extends Activity {
 
   
 @Override
   
 protected void onCreate(Bundle
savedInstanceState) {
     
 
 super.onCreate(savedInstanceState);
 
     
   View disView = new
DispatchView(this);
     
   LayoutParams lp = new
LayoutParams(LayoutParams.FILL_PARENT,
     
     
   
 LayoutParams.FILL_PARENT);
     
   setContentView(disView,
lp);
   
 }
 
   
 @Override
     public
boolean onTouchEvent(MotionEvent event) {
     
   if (event.getAction() ==
MotionEvent.ACTION_DOWN) {
     
     
 Log.i("()()", "Parent onTouchEvent
Down!!!!!!!!!!!!!!!!");
     
   }
     
   return
super.onTouchEvent(event);
   
 }
 
   
 @Override
     public
boolean dispatchTouchEvent(MotionEvent ev) {
     
   if (ev.getAction() ==
MotionEvent.ACTION_DOWN) {
     
     
 Log.i("()()", "Parent dispatchTouchEvent
Down????????????????");
     
   }
     
   return
super.dispatchTouchEvent(ev);
   
 }
 
     public
class DispatchView extends View {
     
   
     
   private Paint paint = new
Paint();
 
     
   public DispatchView(Context
context) {
     
     
 super(context);
     
     
 paint.setColor(Color.RED);
     
   }
 
     
   @Override
     
   public boolean
dispatchTouchEvent(MotionEvent event) {
     
     
 if (event.getAction() == MotionEvent.ACTION_DOWN)
{
     
     
   
 Log.i("()()", "Child dispatchTouchEvent
Down#############");
     
     
   
 paint.setColor(Color.BLUE);
     
     
   
 invalidate();
     
     
 }
     
     
 return super.dispatchTouchEvent(event);
     
   }
 
     
   @Override
     
   public boolean
onTouchEvent(MotionEvent event) {
     
     
 if (event.getAction() == MotionEvent.ACTION_DOWN)
{
     
     
   
 Log.i("()()", "Child onTouchEvent
Down*****************");
     
     
   
 paint.setColor(Color.GREEN);
     
     
   
 invalidate();
     
     
 }
     
     
 return super.onTouchEvent(event);
     
   }
 
     
   @Override
     
   protected void onDraw(Canvas
canvas) {
     
     
 canvas.drawRect(30, 30, 300, 300, paint);
     
     
 super.onDraw(canvas);
     
   }
 
   
 }
 
 }

实例效果如下:

 



当点击红色的View时,log如下:

 



如果Child View设置了OnClickListener,那么和在Child
View的onTouchEvent函数中返回True是一个效果,也就是此事件不再向上传播。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: