[Flutter]從零開始實現一個嵌套滑動的PageView(二)

前言

前面實現了嵌套滑動,那麼下面,就要考慮如何將動畫加入其中app

首先須要瞭解的知識(課前準備)

  1. Flutter中管理動畫的部分其實就是physics,可是physics的動畫效果是如何設置並應用給pageView,並供其展現的呢?這時候須要瞭解的部分就是ScrolActivity。
  2. Flutter中觸摸事件分爲dragStrat、dragDown等等,可是咱們在NestedScrollerView中並沒看到相關的觸摸事件,其實flutter已經對觸摸事件進行了基本處理,並將觸摸事件轉換爲效果,這時候須要咱們瞭解的部分就是drag,hold以及goIdel,goBallistic 等方法。

將全部事件統一交給一個管理器管理分發

在NestedScrollerView 中 嵌套滑動的處理是由_NestedScrollCoordinator 統一管理處理的,爲了可以協調當前body和header,這應該是最直接的方式動畫

因此按照NestedScrollerView 中_NestedScrollCoordinator 的作法,建立一個類,繼承ScrollActivityDelegate和ScrollHoldController,並修改position 的方法,將其中drag,hold等須要協調處理的方法交由這個新類實現。spa

跟NestedScrollerView不一樣的是,嵌套滑動判斷優先級應以最早接收到事件的控件先作響應,好比說,若是我先收到的是子Page的滑動事件,在沒法滑動或者事件處理完以前,外部的pageView都應該是沒法響應的。而非NestedScrollerView中根據滑動方向判斷優先級的方式。orm

因此爲了實現上面一點,咱們能夠給position加上是否是inner這個標誌,而後根據drag方法傳入的inner標誌判斷當前觸發的position是子Page仍是父Page。cdn

在overScroll的時候,將子PageView的事件轉給父Page

在applyUserOffset 方法中,判斷子Page的position,其pixels加上滑動距離是否大於maxScrollExtent,經過這個簡單判斷一下是否是overScroll,並將事件根據結果分發給子Page或者父pageblog

在goBallistic 方法中,我是根據滑動方向判斷子Page是否會overScroll。繼承

固然,別忘了加上inner標誌的處理事件

Look Look 效果

NestedPageView
NestedPageView

後記

如今解決掉了嵌套動畫的問題,說白了就是處理goBallistic以及Activity;
那麼下面還需解決的問題還有:ci

  1. 連續快速滑動(很是快速滑動的狀況下,子Page偶爾會出現未滑動到底)(額,這是個低級bug……已解決)
相關文章
相關標籤/搜索