tweenTo method
void
tweenTo(})
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),
);
}