android下ViewGroup的事件分發和處理
先寫個簡單的demo:
布局檔案中一個繼承自ViewGroup的自訂控制項MyLayout包含一個Button:
自訂控制項中重寫事件分發的兩個重要方法:onInterceptTouchEvent 和 dispatchTouchEvent
public class MyLayout extends LinearLayout {public MyLayout(Context context, AttributeSet attrs) {super(context, attrs);}//是否攔截事件的傳遞,true:攔截@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {//false:把touch事件傳遞到子控制項return false;}//LinearLayout並沒有重寫dispatchTouchEvent//ViewGroup重寫了View的dispatchTouchEvent方法@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {return super.dispatchTouchEvent(ev);}}在MainActivity中設定兩個控制項的點擊事件:
layout.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Log.i(tag, click layout --------);}});button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Log.i(tag, click button --------);}});
此時點擊Button,由於在外層MyLayout沒有阻止事件的傳遞,所以Button響應並處理了事件,列印click button的log
如果在MyLayout的onInterceptTouchEvent 中return true則表示MyLayout阻止了事件的傳遞,此時列印click layout
問題:當點擊螢幕時系統如何確定是哪個view被點中呢?
實際上每個view對應螢幕上的一塊矩形地區,當點擊螢幕時系統通過判斷該點屬於哪塊矩形地區來確定哪個view被選中