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是一個效果,也就是此事件不再向上傳播。

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM