Flutter 开发实战

235课时
2.1K学过
8分

课程评价 (0)

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

学员评价

暂无精选评价
2分钟

05 ScrollPhysics 工作原理

那么 ScrollPhysics 是怎么实现滚动和边缘拖拽的呢? ScrollPhysics 默认是没有什么代码逻辑的,它的主要定义方法如下所示:

/// [position] 当前的位置, [offset] 用户拖拽距离
/// 将用户拖拽距离 offset 转为需要移动的 pixels
double applyPhysicsToUserOffset(ScrollMetrics position, double offset)

/// 返回 overscroll ,如果返回 0 ,overscroll 就一直是0
/// 返回边界条件
double applyBoundaryConditions(ScrollMetrics position, double value)

///创建一个滚动的模拟器
Simulation createBallisticSimulation(ScrollMetrics position, double velocity)  

///最小滚动数据
 double get minFlingVelocity

///传输动量,返回重复滚动时的速度
double carriedMomentum(double existingVelocity)

///最小的开始拖拽距离
double get dragStartDistanceMotionThreshold

///滚动模拟的公差
///指定距离、持续时间和速度差应视为平等的差异的结构。
Tolerance get tolerance

上方代码标注了 ScrollPhysics 各个方法的大致作用,而在前面 《十三、全面深入触摸和滑动原理》 中,我们深入解析过触摸和滑动的原理,大致流程从触摸开始往下传递, 最终触发 layout 实现滑动的现象:

ScrollPhysics 的工作原理就穿插在其中,其流程如下图所示, 主要的逻辑在于红色标注的的三个方法:

  • applyPhysicsToUserOffset :通过 physics 将用户拖拽距离 offset 转化为 setPixels(滚动) 的增量。
  • applyBoundaryConditions :通过 physics 计算当前滚动的边界条件。
  • createBallisticSimulation : 创建自动滑动的模拟器。

img

这三个方法的触发时机在于 _handleDragUpdate_handleDragCancel_handleDragEnd ,也就是拖动过程和拖动结束的时机:

  • applyPhysicsToUserOffsetapplyBoundaryConditions 是在 _handleDragUpdate 时被触发的。
  • createBallisticSimulation 是在 _handleDragCancel_handleDragEnd 时被触发的。

所以默认的 BouncingScrollPhysicsClampingScrollPhysics 最大的差异也在这个三个方法。