tweenTo method

void tweenTo(
  1. Base config,
  2. ViewportAnimationConfig animationConfig, {
  3. Function? onComplete,
  4. double ease(
    1. double
    )?,
  5. double? duration,
})

Implementation

void tweenTo(
  Base config,
  ViewportAnimationConfig animationConfig, {
  Function? onComplete,
  double Function(double)? ease,
  double? duration,
}) {
  final targetCoverage = animationConfig.targetCoverage ?? 0.3;
  final targetAreaSize = stageWidth * stageHeight * targetCoverage;

  /// 初始缩放下元素的尺寸信息,比例缩放后得到的是在 屏幕尺寸下元素的尺寸
  final rect = rectTransformWithConfig(config);

  /// 计算初始缩放下,地图左上角坐标
  final rectCenterX = rect.x + rect.width / 2;
  final rectCenterY = rect.y + rect.height / 2;
  final stageCenterX = stageWidth * (animationConfig.viewportAnchorX ?? 0.5);
  final stageCenterY =
      stageHeight * (animationConfig.viewportAnchorY ?? 0.58);

  final elementArea = rect.width * rect.height;
  final derivedScale = targetAreaSize / elementArea;
  final calculatedScale = Math.sqrt(derivedScale);
  final finalScale = clampedScale(
    animationConfig.targetScale ?? calculatedScale,
  );
  final targetX = stageCenterX - rectCenterX * finalScale;
  final targetY = stageCenterY - rectCenterY * finalScale;

  final finalX = clampedX(targetX, finalScale);
  final finalY = clampedY(targetY, finalScale);
  final currentScale = viewportScale;
  _previousViewportState = ViewportStateSnapshot(
    x: _viewport.x,
    y: _viewport.y,
    scale: _viewport.scale,
  );
  _viewport.tween(
    duration: duration ?? .2,
    scale: finalScale,
    ease: ease ?? GEase.easeInOut,
    x: finalX,
    y: finalY,
    onComplete: onComplete,
  );
  _event.emit(
    'zoom',
    ZoomEventData(prevScale: currentScale, nextScale: finalScale),
  );
}