Пожалуйста, просмотрите каждый раздел ниже для описания моей проблемы, описанной тремя разными способами. Надеюсь, это поможет людям ответить.
Проблема: Как найти пару координат, выраженную в холсте / пользовательском пространстве, когда у вас есть только координата, выраженная в терминах увеличенного изображения, с учетом исходной точки масштабирования и коэффициента масштабирования?
Проблема на практике :
В настоящее время я пытаюсь воспроизвести функцию масштабирования, используемую в таких приложениях, как галерея / карты, когда вы можете ущипнуть, чтобы увеличить / уменьшить масштаб, перемещая масштаб к средней точке защемления.
Внизу я сохраняю центральную точку масштабирования (которая находится в координатах 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 ).
В этом примере, если вы масштабировали с коэффициентом 2 вокруг A, то вы щелкнули по позиции B, X, Y, представленные как B, будут основаны на положении экрана, а не на положении относительно 0,0 исходного холст.
Мне нужно найти способ получить абсолютную позицию B.