我正在编写一个Android(Xamarin)应用程序,它能够缩放和平移图像。用户也可以在图片上点击某个位置。我需要以后使用这些坐标。
以下代码是用于缩放和平移图像的:
protected override void OnDraw(Canvas canvas)
{
base.OnDraw(canvas);
_maxX = canvas.Width;
_maxY = canvas.Height;
canvas.Translate(_posX, _posY);
if (_scaleDetector.IsInProgress)
canvas.Scale(_scaleFactor, _scaleFactor, _scaleDetector.FocusX, _scaleDetector.FocusY);
else
canvas.Scale(_scaleFactor, _scaleFactor, _lastGestureX, _lastGestureY);
}
到目前为止还不错,现在我有一些使用中的MotionEvent
,它是一个LongPressListener
。我编写了以下代码将MotionEvent
上的坐标转换为图像上的坐标:
var actualX = e.GetX() - (_parent._posX / _parent._scaleFactor);
var actualY = e.GetY() - (_parent._posY / _parent._scaleFactor);
e
在这里是图像的框架。框架包含一个图像(即_parent
),用户可以拖动该图像。_parent._posX/Y
会随之更改。用户还可以缩放图像,这就是_scaleFactor
。
因此,当用户在e
中的任何位置轻触时,我需要将这些坐标转换为图像坐标。
这两行代码有效,但是当用户放大时,坐标会偏移,如下附图所示:
红点表示计算出的位置。正如您所看到的,如果用户放大,则坐标会更加偏离。这个计算有什么问题吗?
canvas.Translate(_posX, _posY);
- gi097