handleScaleUpdate method

  1. @override
void handleScaleUpdate(
  1. ScaleUpdateDetails details
)

Implementation

@override
void handleScaleUpdate(ScaleUpdateDetails details) {
  // 取消原组件对totalScale的判断。这样scale大于1也能执行slidePage的slide方法
  if (extendedImageSlidePageState != null &&
      _gestureDetails!.userOffset &&
      _gestureDetails!.actionType == ActionType.pan) {
    final Offset totalDelta = details.focalPointDelta;
    bool updateGesture = false;
    if (!extendedImageSlidePageState!.isSliding) {
      if (totalDelta.dx != 0 &&
          totalDelta.dx.abs().greaterThan(totalDelta.dy.abs())) {
        if (_gestureDetails!.computeHorizontalBoundary) {
          if (totalDelta.dx > 0) {
            updateGesture = _gestureDetails!.boundary.left;
          } else {
            updateGesture = _gestureDetails!.boundary.right;
          }
        } else {
          updateGesture = true;
        }
      }
      if (totalDelta.dy != 0 &&
          totalDelta.dy.abs().greaterThan(totalDelta.dx.abs())) {
        if (_gestureDetails!.computeVerticalBoundary) {
          if (totalDelta.dy < 0) {
            updateGesture = _gestureDetails!.boundary.bottom;
          } else {
            updateGesture = _gestureDetails!.boundary.top;
          }
        } else {
          updateGesture = true;
        }
      }
    } else {
      updateGesture = true;
    }

    if (details.focalPointDelta.distance.greaterThan(minGesturePageDelta) &&
        updateGesture) {
      extendedImageSlidePageState!.slide(
        details.focalPointDelta,
        extendedImageGestureState: this,
      );
    }
  }

  if (extendedImageSlidePageState != null &&
      extendedImageSlidePageState!.isSliding) {
    return;
  }

  // totalScale > 1 and page view is starting to move
  if (_pageViewState != null) {
    final ExtendedImageGesturePageViewState pageViewState = _pageViewState!;

    final Axis axis = pageViewState.widget.scrollDirection;
    final bool movePage = _pageViewState!.isDraging ||
        (details.pointerCount == 1 &&
            details.scale == 1 &&
            _gestureDetails!.movePage(details.focalPointDelta, axis));

    if (movePage) {
      if (!pageViewState.isDraging) {
        pageViewState
            .onDragDown(DragDownDetails(globalPosition: details.focalPoint));
        pageViewState.onDragStart(
            DragStartDetails(globalPosition: details.focalPoint));
        //assert(!pageViewState.isDraging);
      }
      Offset delta = details.focalPointDelta;
      delta =
          axis == Axis.horizontal ? Offset(delta.dx, 0) : Offset(0, delta.dy);

      pageViewState.onDragUpdate(DragUpdateDetails(
        globalPosition: details.focalPoint,
        delta: delta,
        primaryDelta: axis == Axis.horizontal ? delta.dx : delta.dy,
      ));

      return;
    }
  }
  final double? scale = widget.canScaleImage(_gestureDetails)
      ? clampScale(
          _startingScale! * details.scale * _gestureConfig!.speed,
          _gestureConfig!.animationMinScale,
          _gestureConfig!.animationMaxScale)
      : _gestureDetails!.totalScale;

  //Round the scale to three points after comma to prevent shaking
  //scale = roundAfter(scale, 3);
  //no more zoom
  if (details.scale != 1.0 &&
      ((_gestureDetails!.totalScale!
                  .equalTo(_gestureConfig!.animationMinScale) &&
              scale!.lessThanOrEqualTo(_gestureDetails!.totalScale!)) ||
          (_gestureDetails!.totalScale!
                  .equalTo(_gestureConfig!.animationMaxScale) &&
              scale!.greaterThanOrEqualTo(_gestureDetails!.totalScale!)))) {
    return;
  }

  final Offset offset = (details.scale == 1.0
          ? details.focalPoint * _gestureConfig!.speed
          : _startingOffset) -
      _normalizedOffset * scale!;

  if (mounted &&
      (offset != _gestureDetails!.offset ||
          scale != _gestureDetails!.totalScale)) {
    gestureDetails = GestureDetails(
        offset: offset,
        totalScale: scale,
        gestureDetails: _gestureDetails,
        actionType: details.scale != 1.0 ? ActionType.zoom : ActionType.pan);
  }
}