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