我正在编写一个能够缩放和平移图像的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
中的任何位置时,我需要将这些坐标转换为图像坐标。
这两行代码有效,但当用户放大时,坐标会关闭,如附图所示:
红点代表计算的位置。如您所见,如果用户放大坐标会获得更多关闭。这个计算有什么问题?
答案 0 :(得分:3)
尝试这样做: -
var actualX = (e.GetX() - _parent._posX) / _parent._scaleFactor;
var actualY = (e.GetY() - _parent._posY) / _parent._scaleFactor;
答案 1 :(得分:0)
我认为您的问题是因为Canvas没有更新,请在缩放后尝试使用constructor(private fb: FormBuilder, private auth: AuthService, private route: Router) { }
doLogin() {
if (!this.userForm.valid) { return; }
this.auth.login(this.userForm.value).subscribe((res) => {
//do something
})
}
。
答案 2 :(得分:0)
我设法使用Matrix
对其进行了修复:
private float[] TranslateCoordinates(float[] coordinates)
{
var matrix = new Matrix(Matrix);
matrix.PreScale(_scaleFactor, _scaleFactor);
matrix.PreTranslate(_posX, _posY);
matrix.Invert(matrix);
matrix.MapPoints(coordinates);
return coordinates;
}
float[]
包含MotionEvent
的{{1}}和GetX()
的值。