Android: получить правильные координаты с масштабированным и переведенным холстом - PullRequest
0 голосов
/ 14 мая 2018

Я пишу приложение для 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 голосов
/ 04 июня 2018

Я думаю, что ваша проблема в том, что Canvas не обновляется, попробуйте использовать Canvas.UpdateLayout после увеличения.

0 голосов
/ 18 июля 2018

Мне удалось это исправить с помощью 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 GetX() и GetY().

0 голосов
/ 14 мая 2018

Попробуйте сделать это: -

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

  var actualY = (e.GetY() - _parent._posY) / _parent._scaleFactor;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...