2010-10-07 17 views
10

Quería crear una galería con imágenes. Las imágenes dentro de la galería deben ser ampliables y pannables. Pude pellizcar y hacer zoom en una imagen pero no pude establecer los límites de zoom y evitar que la imagen salga de la pantalla. que utiliza el código siguiente para acercar o alejar una imagen: http://code.google.com/p/4chan-image-browser/source/browse/src/se/robertfoss/MultiTouch/TouchImageView.java?spec=svnd3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5&r=d3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5ImageView Pinch-zoom Límites de escala y límites de panorámica

Primera aproximación: Solía ​​TouchImageView para suministrar imágenes a la galería, esto me permite pellizco zoom pero No se desplaza por la galería. es decir, no puedo diferenciar entre 'evento de pestaña individual' y 'pestaña para desplazar evento'.

Segundo acercamiento: Usó ImageView para suministrar imágenes a la galería, y si el usuario hace clic en cualquiera de los elementos de la galería, visualiza la imagen seleccionada en TouchImageView, donde el usuario puede acercar o alejar una imagen. Pero esto también me impide desplazarme por la vista de galería. ¿Y también cómo establecer límites de zoom y límites de panorámica en la imagen seleccionada?

Respuesta

3

Puede establecer límite del zoom añadiendo estas líneas a ACTION_MOVE, modo == 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; 

Del mismo modo, agregar líneas a ACTION_MOVE, modo == DRAG que tenga en cuenta la ubicación original de la imagen, la longitud traducida, y luego compararlos con los límites.

+0

Tiene la idea correcta de llamar 'matrix.getValues ​​(f);'. Sin embargo, la solución no es el retorno verdadero, ya que esto simplemente congelará la pantalla. En cambio, si el valor de escala está a punto de superar MAX_SCALE, establezca el valor de escala igual a MAX_SCALE. Verifique mi respuesta a continuación para una implementación completa usando este método. –

2

Proporcioné una respuesta here que agrega panoramización, zoom y detección de límite a ImageView.

20

Esto solucionó el problema de zoom-límite para mí. Después de acercar/alejar la imagen hasta el límite, simplemente deja de ir más lejos. También es suave y no hay retrasos. 0.7 y 2.0 son los niveles de zoom mínimo y máximo.

.... 
} 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); 
    } 
} 
....   
+1

¡me salvaste el día, querido! debe ser aceptada respuesta! –

3

intentado usar el código de abajo y aunque funciona me encontré con que estaba causando pequeños valores incrementales a acumularse en Trans Trans X e Y que conduce a la imagen en movimiento lentamente fuera de la pantalla.

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); 

i fijo esta se almacena una matriz original en un flotador [] (1,0,0,0,1,0,0,0,1) y restablecer la matriz de nuevo a estos valores cada vez scaleX < 1. Espero que esto ayude a alguien más un día :)

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); 
}