Масштабирование масштаба изображения и рамки панорамирования
Я хотел создать галерею с изображениями.
Изображения в галерее должны быть масштабируемыми и настраиваемыми. Я смог ущипнуть-увеличить изображение, но не смог установить ограничения масштабирования и не допустить, чтобы изображение выходило из экрана.
Я использовал следующий код для увеличения изображения:
http://code.google.com/p/4chan-image-browser/source/browse/src/se/robertfoss/MultiTouch/TouchImageView.java?spec=svnd3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5&r=d3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5
Первый подход:
Я использовал TouchImageView для доставки изображений в галерею, это позволяет мне зажимать зум, но
не может прокручивать галерею. я не могу различать "событие с одной вкладкой" и "вкладка для прокрутки события".
Второй подход:
Используемый ImageView для загрузки изображений в галерею, и если пользователь нажимает на любой элемент галереи, отображает выбранное изображение в TouchImageView, где пользователь может зажимать изображение. Но это также мешает мне прокручивать представление галереи. А также, как установить ограничения масштабирования и панорамы на выбранном изображении?
Ответы
Ответ 1
Это фиксировало проблему ограничения масштаба для меня. После того, как изображение будет увеличено до предела, оно просто перестанет двигаться дальше. Он также гладкий и нет лаг. 0.7 и 2.0 - минимальный и максимальный уровни масштабирования.
....
} else if (mode == ZOOM) {
float[] f = new float[9];
float newDist = spacing(event);
if (newDist > 10f) {
matrix.set(savedMatrix);
float tScale = newDist / dist;
matrix.postScale(tScale, tScale, mid.x, mid.y);
}
matrix.getValues(f);
float scaleX = f[Matrix.MSCALE_X];
float scaleY = f[Matrix.MSCALE_Y];
if(scaleX <= 0.7f) {
matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y);
} else if(scaleX >= 2.5f) {
matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y);
}
}
....
Ответ 2
Вы можете установить предел масштабирования, добавив эти строки в ACTION_MOVE, mode == ZOOM:
float[] f = new float[9];
matrix.getValues(f);
float scaleX = f[Matrix.MSCALE_X];
float scaleY = f[Matrix.MSCALE_Y];
if (scaleX > MAX_SCALE || scaleY > MAX_SCALE) return true;
Аналогичным образом добавьте строки в ACTION_MOVE, mode == DRAG, которые учитывают исходное местоположение вашего изображения, переведенную длину и затем сравнивают их с границами.
Ответ 3
Попробовали использовать этот код ниже, и хотя он работает, я обнаружил, что он вызывает небольшие инкрементные значения, которые накапливаются в Trans X и Trans Y, что приводит к медленному перемещению изображения с экрана.
if(scaleX <= 0.7f)
matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y);
else if(scaleX >= 2.5f)
matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y);
Я исправил это, сохраняя исходную матрицу в поплавке [] (1,0,0,0,1,0,0,0,1) и возвращая матрицу обратно к этим значениям всякий раз, когда scaleX < 1. Надеюсь, это когда-нибудь поможет кому-то еще:)
if(scaleX <= 1.0f) {
float[] originalmatrixvalues = new float[] {1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f};
matrix.setValues(originalmatrixvalues);
} else if(scaleX >= 2.5f) {
matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y);
}
Ответ 4
Я предоставил ответ здесь, который добавляет панораму, масштабирование и обнаружение границ в ImageView.