[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……已解决)
相关文章
相关标签/搜索