Масштабирование изображения ImageView с сохранением центральной точки в том же месте - PullRequest
2 голосов
/ 08 июля 2011

Я установил предварительно масштабированное растровое изображение в качестве источника ImageView. Затем я прочитал Матрицу ImageView и сдвинул Битовую карту ImageView с помощью matrix.postTranslate(shiftX, shiftY).

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

Если я пытаюсь увеличить изображение с помощью matrix.postScale(zoom, zoom), точка, которую я хочу сохранить (синяя точка), переместится в другое место (фиолетовая точка).

Я пробовал несколько разных способов вернуть растровое изображение обратно, но не могу заставить его работать правильно. Я знаю исходный размер растрового изображения, размер ImageView, расстояния, отмеченные пунктирной линией. Пытался вычислить необходимый сдвиг и затем использовать matrix.postTranslate(-zoomshiftX, -zoomshiftY), но он не сдвигается правильно.

Даже обнаружил, что количество пикселей в растровом изображении не меняется после функции matrix.postScale () и пробовал matrix.postTranslate (-zoomshiftX / zoom, -zoomshiftY / zoom) - но все же не повезло.

Как мне добиться такого увеличения?

scalling issue

Ответы [ 2 ]

1 голос
/ 08 июля 2011

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

Расширение RelativeLayout и переопределение dispatchDraw () для создания масштабируемой ViewGroup

0 голосов
/ 19 апреля 2014

Может быть, это может быть полезно:

Если у вас есть два пальца на экране, вы можете получить событие двух пальцев и получить среднюю точку:

PointF mid;
MotionEvent event;
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
mid.set(x / 2, y / 2);

Тогда вы можетеустановите масштаб, имеющий среднюю точку в центре экрана:

matrix.postScale(scale, scale, mid.x, mid.y);
...