1. 程式人生 > >android 使父控制元件和子控制元件都處理觸控事件方式

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