android事件傳遞問答

android中的事件響應方式是冒泡的方式,最深層的元素先響應, 但是事件傳遞是先從最外層傳到被點擊view,然後再向上傳遞到最頂層。
點擊某個view後,那個view先接收ActionDown事件,如果還想繼續捕獲move或者其他事件,需要return true, 不捕獲就return false。

問答

事件傳遞相關問題:
    能不能不讓最深層的元素不接收ActionDown事件?
可以,由於事件是先由頂層view向下傳遞的,所以可以阻止事件傳遞到被點擊的view,只要在父類的onInterceptTouchEvent中進行捕獲(return true)即可,捕獲後的事件直接被父類處理,比如我們攔截了move事件,即使父view的onTouchView中返回的是false, 依然可以接收到move和up事件, 但是如果攔截的是down事件,那麼onTouchMove中必須返回true才能繼續接收move和up事件,看來最關鍵的事件還是這個down事件,絕對着你能不能繼續接收後續事件。

    能不能只捕獲ActionUP事件?
不能,如果父view捕獲了ActionUP事件,那麼孩子view會收到一個actionDown和actionMove事件,當ActionUP時候只會接收一個ACTION_CANCEL事件,但是注意父view也沒有接收到actionup事件,難道是因爲沒有接收過down事件?但是我們攔截move事件的情況下,是可以接收到actionup事件的。

    能不能只捕獲ActionMove事件?
不能,如果父view捕獲了ActionMove事件,那麼孩子view會接收到一個ActionCancel事件,從此所有的事件會被傳遞給父View,父View不管onTouchView中是返回true或者false,move和up事件都會繼續傳遞給它。

    不通過父view攔截的方式,子view能否只攔截ActionDown事件或者只攔截ActionUP事件?
可以,讓子view的onTouchEvent返回false,子view只會接收到down事件,其他後續事件並不會被接收到。

    可不可以讓子view和父view同時接收到down事件?
可以,當子view中沒有消費down事件,那麼down事件會被退給父view,父view的onTouchEvent中會接收到,但是如果子view中已經消費了down事件,那麼父view就接收不到了。

    可不可以同時在子view和父view中處理move事件?
不可以,同一個move事件要麼出現在父view中,要麼在子view中,但是我們可以控制到底由哪一個來響應,比如用戶橫向滑動時可以由父view響應處理,豎向滑動時由子view響應處理。

    可不可以先讓父view攔截某個事件,然後動態的關閉攔截?
不可以,一旦父view攔截了某個事件,那麼子view就會接收到一個cancel事件,子view就不會再響應事件了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章