
流程圖整理自Android 觸摸事件機制(四) ViewGroup中觸摸事件詳解 | skywang
事情起因:
要用RelativeLayout去攔截里面的子View的點擊事件,因此直接為
relativeLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
打算通過返回true來將后續(xù)的點擊事件消費掉,但是失敗了。
在看了源碼分析之后,找到原因:
- 當ViewGroup有子View的時候,一定能攔截點擊事件的入口是
onInterceptTouchEvent()。 - 當ViewGroup有子View能接收點擊事件的時候,不會調(diào)用ViewGroup任何自己的點擊事件監(jiān)聽方法(無論內(nèi)部還是外部設置的監(jiān)聽器)。
- 當ViewGroup沒有子View能接收點擊事件時,則會調(diào)用super.dispatchTouchEvent(),此時將ViewGroup當做View來看,按照View的那一套來。
結(jié)論:
我的RelativeLayout里面的子View可以接收點擊事件,因此點擊事件會直接傳給他們,無法通過外部設置監(jiān)聽器去攔截。