下拉放大頭部圖片並彈回

Android事件的分發機制(Touch)

  1. 事件類型(4種):
事件類型 具體動做
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。函數

  1. 事件的分發即事件的傳遞

Activity->ViewGroup->Viewspa

dispathTouchEvent()->onInterceptTouchEvent()->onTouchEvent()code

當一個點擊事件發生時,事件最早傳到ActivitydispatchTouchEvent()進行事件分發事件

建立一個新的layout並重寫onInterceptTouchEvent() 和onTouchEvent()

  1. onInterceptTouchEvent()中攔截DOWN事件,若是檢測到向下滑動View,return true(將事件分發給後面的OnTouchEvent())。
  2. onTouchEvent()中的ACTION_DOWN動做中得到向下滑動的實時距離,並用function將header圖片進行放大
  3. onTouchEvent()中的ACTION_UP動做中使用恢復header圖片的尺寸的function將下拉的圖片彈回
  4. 在自定義的layout中,須要使用函數將header從Activity傳入Layout,在Activity中使用setHeader()函數將header的id傳過來。

觸摸方向衝突問題

  1. 當外部的Layout截獲了Touch事件後,內部的View將再也不可以獲取處處理ViewTouch事件的權力,此時會出現觸摸方向衝突問題:當手指按下屏幕並向下滑動,正常狀況下應該是下拉回彈的動做,但此時若是沒有鬆開手指而是往回拖動View並超過了原來View的初始位置時,View再也不自動滾動,失去手指的控制能力。這是由於當觸發了下拉回彈的動做條件時,該動做會被LayoutonTouchEvent()截獲,而View的滾動是屬於View自己的動做,不受Layout支配,這時要想辦法將Layout的控制權交出給View圖片

    dispatchTouchEvent()使用一個Boolean來判斷是不是第一次上拉動做,而後再在onTouchEvent()中的須要交出控制權的條件內部,建立一個新的TouchEvent並付給該View,使用dispatchTouchEvent(event)來付與View控制權,用return false將控制權從onTouchEvent()還回dispatchTouchEvent()。這樣在檢測到不該該被截獲的動做時,動做權被交還給dispatchTouchEvent()it

相關文章
相關標籤/搜索