Added zoom centering on touch devices

This commit is contained in:
Mitchell McCaffrey 2020-10-23 13:07:29 +11:00
parent 37542dc0e6
commit 58fc986ca7

View File

@ -45,16 +45,13 @@ function useStageInteraction(
maxZoom
);
// Center on pointer
const pointer = stage.getPointerPosition();
const pointerChange = {
x: (pointer.x - stage.x()) / stageScale,
y: (pointer.y - stage.y()) / stageScale,
const newTranslate = {
x: pointer.x - ((pointer.x - stage.x()) / stageScale) * newScale,
y: pointer.y - ((pointer.y - stage.y()) / stageScale) * newScale,
};
const newTranslate = {
x: pointer.x - pointerChange.x * newScale,
y: pointer.y - pointerChange.y * newScale,
};
stage.position(newTranslate);
stageTranslateRef.current = newTranslate;
@ -78,18 +75,34 @@ function useStageInteraction(
Math.max(stageScale + distanceDelta * touchZoomSpeed, minZoom),
maxZoom
);
onStageScaleChange(newScale);
// Apply translate
const stageTranslate = stageTranslateRef.current;
const newTranslate = {
x: stageTranslate.x + originXDelta,
y: stageTranslate.y + originYDelta,
const canvasRect = layer.getCanvas()._canvas.getBoundingClientRect();
const relativeOrigin = {
x: originX - canvasRect.left,
y: originY - canvasRect.top,
};
// Center on pinch origin
const centeredTranslate = {
x:
relativeOrigin.x -
((relativeOrigin.x - stage.x()) / stageScale) * newScale,
y:
relativeOrigin.y -
((relativeOrigin.y - stage.y()) / stageScale) * newScale,
};
// Add pinch movement
const newTranslate = {
x: centeredTranslate.x + originXDelta,
y: centeredTranslate.y + originYDelta,
};
stage.position(newTranslate);
stage.draw();
stageTranslateRef.current = newTranslate;
onStageScaleChange(newScale);
pinchPreviousDistanceRef.current = distance;
pinchPreviousOriginRef.current = { x: originX, y: originY };
gesture.onPinch && gesture.onPinch(props);