事件類型 | 具體動做 |
---|---|
MotionEvent.ACTION_DOWN | 按下View(全部事件開始) |
MotionEvent.ACTION_UP | 擡起View |
MotionEvent.ACTION_MOVE | 滑動View |
MotionEvent.ACTION_CANCEL | 結束事件 |
MotionEvent.ACTION_MASK | 處理多點觸控(ACTION_POINTER_UP,ACTION_POINTER_DOWN) |
通常都是由事件DOWN開始到事件UP結束,中間有無數個MOVE。函數
Activity
->ViewGroup
->View
spa
dispathTouchEvent()
->onInterceptTouchEvent()
->onTouchEvent()
code
當一個點擊事件發生時,事件最早傳到Activity
的dispatchTouchEvent()
進行事件分發事件
onInterceptTouchEvent()
中攔截DOWN事件,若是檢測到向下滑動View,return true
(將事件分發給後面的OnTouchEvent()
)。onTouchEvent()
中的ACTION_DOWN
動做中得到向下滑動的實時距離,並用function將header圖片進行放大onTouchEvent()
中的ACTION_UP
動做中使用恢復header圖片的尺寸的function將下拉的圖片彈回Activity
傳入Layout
,在Activity中使用setHeader()函數將header的id傳過來。當外部的Layout
截獲了Touch
事件後,內部的View
將再也不可以獲取處處理View
的Touch
事件的權力,此時會出現觸摸方向衝突問題:當手指按下屏幕並向下滑動,正常狀況下應該是下拉回彈的動做,但此時若是沒有鬆開手指而是往回拖動View
並超過了原來View
的初始位置時,View
再也不自動滾動,失去手指的控制能力。這是由於當觸發了下拉回彈的動做條件時,該動做會被Layout
的onTouchEvent()
截獲,而View
的滾動是屬於View
自己的動做,不受Layout
支配,這時要想辦法將Layout
的控制權交出給View
。圖片
在dispatchTouchEvent()
使用一個Boolean
來判斷是不是第一次上拉動做,而後再在onTouchEvent()
中的須要交出控制權的條件內部,建立一個新的TouchEvent
並付給該View
,使用dispatchTouchEvent(event)
來付與View
控制權,用return false
將控制權從onTouchEvent()
還回dispatchTouchEvent()
。這樣在檢測到不該該被截獲的動做時,動做權被交還給dispatchTouchEvent()
。it