computeScroll method

void computeScroll()

Implementation

void computeScroll() {
  if (_decelerationVelocity.x == 0 && _decelerationVelocity.y == 0) {
    return;
  }

  int currentTime = DateTime.now().millisecondsSinceEpoch;

  if (_decelerationLastTime == 0) {
    _decelerationLastTime = currentTime;
  } else {
    _decelerationVelocity.x *= _dragDecelerationFrictionCoef;
    _decelerationVelocity.y *= _dragDecelerationFrictionCoef;

    double timeInterval = (currentTime - _decelerationLastTime) / 1000;

    double distanceX = _decelerationVelocity.x * timeInterval;
    double distanceY = _decelerationVelocity.y * timeInterval;

    double dragDistanceX = dragXEnabled ? distanceX : 0;
    double dragDistanceY = dragYEnabled ? distanceY : 0;

    painter!.translate(dragDistanceX, dragDistanceY);

    _decelerationLastTime = currentTime;
  }

  if (_decelerationVelocity.x.abs() >= 20 ||
      _decelerationVelocity.y.abs() >= 20) {
    state.setStateIfNotDispose();
    Future.delayed(const Duration(milliseconds: 16), () {
      computeScroll();
    });
  } else {
    painter!.calculateOffsets();
    state.setStateIfNotDispose();
    stopDeceleration();
  }
}