Масштабирование в Android - держать изображение в поле зрения

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

Я использую SimpleScaleGestureListener для обработки сжатия. Мне удалось убедиться, что вы не можете уменьшить масштаб дальше, чем чтобы высота изображения оставалась такой же, как размер экрана (поэтому высота вашего изображения всегда будет не меньше высоты доступного размера экрана).

Тем не менее, я ищу способ автоматически определять, панорамируется ли изображение за пределы этих границ. Так же, как стандартный способ Android для отображения изображения. Поэтому, если я увеличиваю масштаб и перемещаю изображение вверх, а затем уменьшаю масштаб, я хочу, чтобы он определял, когда нижняя часть изображения достигает нижней части экрана, а затем «поворот» масштабирования настраивается соответствующим образом, таким образом никогда не допуская " пробел" над или под самим изображением. Может кто-нибудь помочь мне?

Для справки, вот мои методы onScale и onDraw:

public boolean onScale(ScaleGestureDetector detector){
    float minScale = (float) ((float) SCREEN_SIZE.y / (float) DRAWABLE_SIZE.y);
    mScaleFactor *= detector.getScaleFactor();
    mScaleFactor = Math.max(minScale, Math.min(mScaleFactor, 5.0f));
    invalidate();
    return true;
}

protected void onDraw(Canvas canvas) {
    canvas.save();
    canvas.drawColor(Color.DKGRAY);
    canvas.translate(mPosX, mPosY);
    canvas.scale(mScaleFactor, mScaleFactor, getDrawable().getIntrinsicWidth() / 2,
    getDrawable().getIntrinsicHeight() / 2);

    this.getDrawable().draw(canvas);
    canvas.restore();
}

person Dynde    schedule 27.09.2011    source источник


Ответы (2)


Вы можете использовать android.graphics.Matrix для преобразования нарисованного растрового изображения. Матрица содержит в себе как масштаб, так и перевод.

Вы просто примените матрицу к холсту: canvas.setMatrix

Вы можете легко вычислить размер экрана для нужного прямоугольника:

Matrix.setRectToRect

где источник - это прямоугольник реального разрешения вашего изображения (растрового изображения) с 0,0 слева/сверху и шириной/высотой справа внизу. dst — это прямоугольник целевого представления, в котором будет отображаться растровое изображение.

Тогда вы также можете решить свою задачу - узнать, где будут проведены границы вашего изображения. Matrix.mapRect вычислит, где прямоугольник вашего растрового изображения (как обсуждалось ранее) появится на экране в координатах экрана. Затем вы можете просто указать, где левая сторона изображения рисуется относительно левой стороны экрана, то же самое для верхней/правой/нижней части.

Я не собираюсь давать вам код, просто намекаю, куда идти. Недавно я закодировал программу просмотра изображений с масштабированием, подгонкой к экрану, анимированными переходами и т. Д., И все это было сделано с использованием Matrix и манипуляций с ним.

person Pointer Null    schedule 27.09.2011
comment
Спасибо! Я посмотрю в матрицу. Я ценю, что вы не хотите делиться кодом, но, возможно, у вас есть ссылка на хорошие ресурсы по матрице и как решить мою конкретную проблему? Может хороший учебник? Я, конечно, сам погуглю, но если у вас есть какие-то "первоклассные" предложения, я был бы очень признателен :) - person Dynde; 28.09.2011
comment
Не знаю о конкретной ссылке. Тем не менее, попробуйте найти 2D-преобразование, матричную математику и т. д. Это не так уж сложно, а Matrix очень мощен в графике. На Android Canvas это просто 2D Matrix. - person Pointer Null; 28.09.2011
comment
@мыши привет, не могли бы вы прислать мне код этой конкретной проблемы с матрицей. Я хочу использовать масштабирование и панорамирование в Canvas. Но я не могу делать панорамирование .. Я гуглил, но с помощью Matrix ничего не нашел. Заранее спасибо. - person anddev; 16.02.2012

Простое решение — использовать этот виджет

http://blog.sephiroth.it/2011/04/04/imageview-zoom-and-scroll/

person ingsaurabh    schedule 27.09.2011
comment
Простые решения могут быть отличными :) Однако мне больше всего интересно узнать, как решить эту проблему, а затем просто использовать другой код, хотя это может оказаться полезным в качестве вдохновения :) - person Dynde; 28.09.2011
comment
Код извлекается из приложения «Галерея» по умолчанию, и я долго работал над ним, больше всего я помню, что у него есть матрица по умолчанию для изображения, а затем при уменьшении масштаба / в его сопоставлении изменена матрица. - person ingsaurabh; 28.09.2011