Как найти абсолютную позицию щелчка при увеличении

Пожалуйста, просмотрите каждый раздел ниже для описания моей проблемы, описанной тремя разными способами. Надеюсь, это поможет людям ответить.

Проблема: Как найти пару координат, выраженную в холсте / пользовательском пространстве, когда у вас есть только координата, выраженная в терминах увеличенного изображения, с учетом исходной точки масштабирования и коэффициента масштабирования?

Проблема на практике :

В настоящее время я пытаюсь воспроизвести функцию масштабирования, используемую в таких приложениях, как галерея / карты, когда вы можете ущипнуть, чтобы увеличить / уменьшить масштаб, перемещая масштаб к средней точке защемления.

Внизу я сохраняю центральную точку масштабирования (которая находится в координатах X, Y на основе текущего экрана). Затем я заставляю эту функцию действовать, когда обнаруживается жест «масштабирования»:

class ImageScaleGestureDetector extends SimpleOnScaleGestureListener {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        if(mScaleAllowed) 
            mCustomImageView.scale(detector.getScaleFactor(), mCenterX, mCenterY);
        return true;
    }
}   

Функция масштабирования CustomImageView выглядит следующим образом:

public boolean scale(float scaleFactor, float focusX, float focusY) {
    mScaleFactor *= scaleFactor;

    // Don't let the object get too small or too large.
    mScaleFactor = Math.max(MINIMUM_SCALE_VALUE, Math.min(mScaleFactor, 5.0f));

    mCenterScaleX = focusX;
    mCenterScaleY = focusY;

    invalidate();

    return true;
}

Рисование масштабированного изображения достигается путем переопределения метода onDraw, который масштабирует холст вокруг центр и рисует изображение к нему.

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.save();
    canvas.translate(mCenterScaleX, mCenterScaleY);
    canvas.scale(mScaleFactor, mScaleFactor);
    canvas.translate(-mCenterScaleX, -mCenterScaleY);
    mIcon.draw(canvas);
    canvas.restore();
}

Все это отлично работает при масштабировании от ScaleFactor 1, потому что исходные mCenterX и mCenterY являются координатами, которые основаны на экране устройства. 10, 10 на устройстве - это 10, 10 на холсте.

Однако после того, как вы уже увеличили масштаб, в следующий раз, когда вы щелкнете по позиции 10, 10, она больше не будет соответствовать 10, 10 на холсте из-за того, что масштабирование и преобразование уже были выполнены.

Проблема в абстракции:

На изображении ниже показан пример операции масштабирования вокруг центральной точки A. Каждое поле представляет положение и размер вида при этом коэффициенте масштабирования (1, 2, 3, 4, 5 ).

Example

В этом примере, если вы масштабировали с коэффициентом 2 вокруг A, то вы щелкнули по позиции B, X, Y, представленные как B, будут основаны на положении экрана, а не на положении относительно 0,0 исходного холст.

Мне нужно найти способ получить абсолютную позицию B.

29
задан Graeme 24 November 2011 в 14:49
поделиться