¿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.

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.

  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]); 
  • Cámara android cámara2 manejar zoom
  • Zoom en un lienzo utilizando la función canvas.scale?
  • Zoom suave en vista de mapa
  • Osmdroid y Pinch
  • Dos dedos o pinc zoom a mapview en osmdroid
  • WebView deshacerse de doble toque zoom.
  • Desplazamiento / zoom de una escena en OpenGL y subdivisión
  • Mantenga el mapa centrado, independientemente de dónde pinche el zoom en android
  • Cómo dibujar en un lienzo de vista sin upscaling artefactos cuando el padre de vista tiene un factor de escala?
  • Cómo generar el gesto de zoom / pellizco para probar para Android
  • Zoom centrado en la vista personalizada - calculando las coordenadas de lienzo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.