我正在做一个表面应用程序,我需要在用户用手指缩放(即捏合)时缩放我的场景(缩放)
目前我的工作正常,但问题是我需要放大用户手指之间的中心点。
我的意思是,但翻译背后的数学很难掌握。
当我将 a 应用ScaleTransform
到我的 Canvas 场景时,它会放大画布的左上角,我需要它来放大我的捏合手势的中心点(同样,我确实有)。
翻译的数学如何使缩放看起来放大手势的中心点?
编辑:
这基本上就是我所拥有的:
void Affine2DManipulationDelta(object sender, Affine2DOperationDeltaEventArgs e)
{
//apply zoom and translate
if (e.ScaleDelta != 1)
ApplyZoom(e);
else if (e.Delta.Length != 0)
ApplyTranslation(e);
}
private void ApplyZoom(Affine2DOperationDeltaEventArgs e)
{
//scale
var newScale = _zoomTransform.ScaleX * e.ScaleDelta;
newScale = GetCappedZoomLevel(newScale);
_zoomTransform.ScaleX = newScale;
_zoomTransform.ScaleY = newScale;
}
private void ApplyTranslation(Affine2DOperationDeltaEventArgs e)
{
var xDiff = e.ManipulationOrigin.X - _screenStartPoint.X;
var yDiff = e.ManipulationOrigin.Y - _screenStartPoint.Y;
var translateX = xDiff + _startOffset.X;
var translateY = yDiff + _startOffset.Y;
//bounds testing to limit translation
var rect = new Rect(0.0, 0.0, ZoomCanvas.RenderSize.Width, ZoomCanvas.RenderSize.Height);
Rect bounds = ZoomCanvas.TransformToAncestor(MainViewportCanvas).TransformBounds(rect);
if (CanTranslateX(translateX, bounds))
_translateTransform.X = translateX;
if (CanTranslateY(translateY, bounds))
_translateTransform.Y = translateY;
}
真的很基本,但它在一定程度上有效......
_zoomTransform 是ScaleTransform
, _translateTransform 是TranslateTransform
MainViewport 是一个包含 ZoomCanvas 的画布,它是我应用变换的画布。