Flutter 开发实战

235课时
2.1K学过
8分

课程评价 (0)

请对课程作出评价:
0/300

学员评价

暂无精选评价
2分钟

10 Simulation-1

前面最后说到了,利用 Simulation 实现对列表的滑动、阻尼、回弹效果的实现处理,那么 Simulation 是如何工作的呢?

img

如上图所示,Simulation 的创建是在 ScrollPositionWithSingleContextgoBallistic 方法中被调用的 ,然后通过 BallisticScrollActivity 去触发执行。

  @override
  void goBallistic(double velocity) {
    assert(pixels != null);
    final Simulation simulation = physics.createBallisticSimulation(this, velocity);
    if (simulation != null) {
      beginActivity(BallisticScrollActivity(this, simulation, context.vsync));
    } else {
      goIdle();
    }
  }

BallisticScrollActivity 状态中,Simulation 被用于驱动 AnimationControllervalue ,然后在动画的回调中获取 Simulation 计算后得到的 value 进行 setPixels(value) 实现滚动。

这里又涉及到了动画的绘制机制,动画的机制等新篇再详细说明,简单来说就是 当系统 drawFramevsync 信号到来时,会执行到 AnimationController 内部的 _tick 方法,从而触发 _value = _simulation.x(elapsedInSeconds).clamp(lowerBound, upperBound); 改变和 notifyListeners(); 通知更新。

对于 Simulation 的内部计算逻辑这里就不展开了,大致上可知 ClampingScrollSimulation 的摩擦因子是固定的,而 BouncingScrollSimulation 内部的摩擦因子和计算,是和传递的位置有关系。