android 使父控制元件和子控制元件都處理觸控事件方式
首先必須清楚android中事件的傳遞機制
dispatchTouchEvent->返回true:由自己的onTouchEvent處理
->返回false:->
onInterceptTouchEvent->返回false:由子view的dispatchTouchEvent處理
->返回true:->
onTouchEvent
系統預設是子view接收觸控事件,當子view處理時父view不會處理,
還有一個重要問題,當子view能夠處理onTouch的down事件,則接下來的所有move,up事件都交給子view處理。當子view不能處理down事件,則接下來所有的move事件,up事件也不會處理。
現在我們有三種方法:
1,重寫activity的dispatchTouchEvent,onTouchEvent方法
方法:重寫onTouchEvent或者dispatchTouchEvent,自己處理父view觸控事件
優勢:只要觸控在activity.setContenView的view上就會出發onTouchEvent事件,不管觸控的是子view還是父view
劣勢:一般情況下觸控彈出對話方塊不會觸發onTouchEvent事件
2,重寫父view的dispatchTouchEvent ,onInterceptTouchEvent, onTouch方法
方法1:強制dispatchTouchEvent返回false
結果:父view會處理事件子view不會處理
方法2:強制onInterceptTouchEvent返回true
結果:同1
方法3:使用方法1或者方法2,然後自己重寫onTouch事件,用來處理子View的觸控事件
或者在方法1、2中直接增加處理函式,不用強制返回值
@Override public boolean dispatchTouchEvent(MotionEvent ev) { if(touchListener!=null) { touchListener.onTouch(null,ev); } return super.dispatchTouchEvent(ev); }
結果:雖然能實現父view與子view同時處理觸控事件,但是比較麻煩,同時如果要獲取觸控座標則需要詳細計算相對位置
3,重寫子view的dispatchTouchEvent , onTouch方法
方法1:強制onTouch返回false
結果:父view和子view都能處理down事件,但是move事件和up事件父view不能處理
總結:如果涉及的view不包含對話方塊則使用1,如果包含對話方塊則使用2