Android:使用缩放和平移画布获取正确的坐标

8

我正在编写一个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个回答

3

尝试做到这一点:

  var actualX = (e.GetX() - _parent._posX) / _parent._scaleFactor;

  var actualY = (e.GetY() - _parent._posY) / _parent._scaleFactor;

更好了,但是现在圆圈的位置像是在轴线上方。 - gi097
不要使用_parent._posX/Y,而是使用画布的实际翻译。为此,首先获取画布的矩阵,然后获取transX/Y。 - Amol Jindal
正如您所看到的,我使用这些值来翻译画布:canvas.Translate(_posX, _posY); - gi097
请发布更新_parent._posX/Y的代码。 - Amol Jindal

0

我认为你的问题是由于Canvas没有得到更新,尝试在缩放后使用Canvas.UpdateLayout


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[] 包含了 MotionEventGetX()GetY() 的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接