Android:使用缩放和翻译的画布

时间:2018-05-14 14:05:23

标签: c# android coordinates

我正在编写一个能够缩放和平移图像的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中的任何位置时,我需要将这些坐标转换为图像坐标。

这两行代码有效,但当用户放大时,坐标会关闭,如附图所示:

Screen recording

红点代表计算的位置。如您所见,如果用户放大坐标会获得更多关闭。这个计算有什么问题?

3 个答案:

答案 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()的值。