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