¿Cómo obtener el valor de zoom de la matriz arbitraria?
Una imagen es escalada por una matriz:
Matrix matrix = new Matrix(); matrix.postScale(...); matrix.postTranslate(...); matrix.postRotate(...); ...
Espero que la imagen ampliada no sea menor que la mitad del original, por lo que el zoom total no debe ser inferior a 0,5.
- Zoom de Android y rotación de la vista de imagen
- Obtener el ancho interno de la ventana y la altura del androide integrado en el navegador web en todos los niveles de zoom
- Rendimiento deficiente de la animación de zoom personalizado de Android
- Cómo ampliar una vista de texto en android?
- Toca dos veces para acercar y pellizcar para hacer zoom en ImageView en android
Pero, ¿cómo hacer eso? Traté de obtener el primer valor de la matriz para comprobar:
float pendingZoom = 0.6f; float[] values = new float[9]; Matrix.getValues(values); float scalex = values[Matrix.MSCALE_X];
Entonces:
if(scalex<0.5) { pendingZoom = pendingZoom * (0.5f / scalex); }
Desafortunadamente, no funciona a veces. Si la imagen se ha girado, el scalex
puede ser negativo, el pendingZoom
será negativo también.
¿Cómo hacer esto correctamente?
ACTUALIZAR
Acabo de encontrar los values[Matrix.MSCALE_X]
no es un valor de zoom realiable. Lo uso para calcular el nuevo ancho de un rect, no es correcto.
En cambio, traté de mapear dos puntos por la matriz, y calcular las dos distancias:
PointF newP1 = mapPoint(matrix, new PointF(0, 0)); PointF newP2 = mapPoint(matrix, new PointF(width, 0)); float scale = calcDistance(newP1, newP2) / width;
Ahora puedo obtener el valor de scale
correcto. Pero no estoy seguro si es la mejor solución.
- ¿Cómo puedo obtener funcionalidad de zoom para las imágenes?
- Wiki sobre android-zoom-view.jar
- Cómo capturar el final de una animación Zoom In / Out de un MapController?
- Android MapView - botones de zoom personalizados
- Lona de Android, múltiples rutas con diferentes cantidades de zoom
- Cómo agrandar el elemento central en un listview - android?
- MapController, OSMdroid, zoomToSpan () congela la aplicación
- Zoom automático en Google Maps en java? (Dependiendo de la resolución de pantalla de Android)
float scalex = values[Matrix.MSCALE_X]; float skewy = values[Matrix.MSKEW_Y]; float scale = (float) Math.sqrt(scalex * scalex + skewy * skewy);
Esta solución parece más simple, pero creo que su es mucho más claro y casi tan rápido como éste.
Usted puede tomar el valor absoluto
Math.abs(mMatrixValues[Matrix.MSCALE_X]);
- Manejo de excepciones de Android NDK
- Cómo abrir la carpeta Mis archivos en Android Programatically (using Intent)?