Límites de escala y límites de panorámica ImageView Pinch-zoom

Quería crear una galería con imágenes. Las imágenes dentro de la galería deben ser zoomables y pannable. Podría pinch-zoom una imagen, pero no fue capaz de establecer límites de zoom y evitar que la imagen de ser cortado fuera de la pantalla. Utilicé el siguiente código para ampliar una imagen: http://code.google.com/p/4chan-image-browser/source/browse/src/se/robertfoss/MultiTouch/TouchImageView.java?spec=svnd3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5&r=d3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5

Primer enfoque: Utilicé TouchImageView para suministrar imágenes a la galería, esto me permite pellizcar el zoom pero no puedo desplazar la galería. Es decir, no puedo diferenciar entre 'evento de ficha única' y 'ficha a evento de desplazamiento'.

Segunda aproximación: Utiliza ImageView para suministrar imágenes a la galería, y si el usuario hace clic en cualquiera de los elementos de la galería, muestra la imagen seleccionada en TouchImageView, donde el usuario puede pinchar una imagen. Pero esto también me impide desplazar la vista de la galería. ¿Y también cómo fijar los límites de zoom y los límites de panorámica en la imagen seleccionada?

Esto solucionó el problema del límite de zoom para mí. Después de que la imagen se amplía / desciende hasta el límite, simplemente deja de ir más allá. También es suave y no hay rezagos. 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); } } .... 

Puede establecer el límite de zoom añadiendo estas líneas a 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; 

Del mismo modo, agregue líneas a ACTION_MOVE, mode == DRAG que tenga en cuenta la ubicación original de su imagen, la longitud traducida y luego compárelas con los límites.

He proporcionado una respuesta aquí que agrega panorámica, zoom y detección de límites a ImageView.

He intentado usar este código a continuación y aunque funcione encontré que estaba causando pequeños valores incrementales para acumular en Trans X y Trans Y que conduce a la imagen que se mueve 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); 

Fijé esto almacenando una matriz original en un flotador [] (1,0,0,0,1,0,0,0,1) y restableciendo la matriz de nuevo a estos valores siempre que scaleX <1. Espero que esto ayude a otra persona 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); } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.