Масштабирование масштаба изображения и рамки панорамирования

Я хотел создать галерею с изображениями. Изображения в галерее должны быть масштабируемыми и настраиваемыми. Я смог ущипнуть-увеличить изображение, но не смог установить ограничения масштабирования и не допустить, чтобы изображение выходило из экрана. Я использовал следующий код для увеличения изображения: 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.