2012-05-04 10 views
5

Estoy tratando de mostrar una imagen, que se puede ampliar y panoramizar, y que gira con una brújula. Con el siguiente código, las tres acciones funcionan, pero se influyen mutuamente.Rotación, traducción y escalado simultáneos del mapa de bits en el lienzo de Android

Esto es lo que quiero lograr: 1.
girar alrededor del centro de la pantalla
2. Escala de salir de la misma parte del cuadro en el centro
3. Pan al punto deseado en el cuadro

Esto es lo que está sucediendo realmente con el código de abajo: 1. Rotación
funciona como está previsto, en torno al centro de la pantalla
2. obras de escala, pero las escalas alrededor del centro de la imagen
3. La traducción sólo funciona como está previsto si angle es cero, de lo contrario se está moviendo en una dirección equivocada

// the center of the view port 
float centerX = screen.right/2; 
float centerY = screen.bottom/2; 

Matrix m = new Matrix(); 
m.preRotate(angle, centerX, centerY); 
m.preScale(mScaleFactor, mScaleFactor, centerX, centerY); 

// scaling the amount of translation, 
// rotating the translation here gave crazy results 
float x = mPosX/mScaleFactor; 
float y = mPosY/mScaleFactor; 
m.preTranslate(x, y); 

canvas.drawBitmap(pic, m, null); 

Si traduzco primero, y luego girar, la traducción funciona como está previsto, pero la rotación no está cerca del centro de el puerto de vista más.

¿Cómo puedo aplicar las tres transformaciones, sin que se influencien entre sí?

Respuesta

1

No estoy seguro acerca de la escala alrededor del centro de la imagen, pero en cuanto a la traducción que está en la dirección incorrecta, ¿no es por la rotación de la imagen pero no por las traducciones? Tal vez intente algo como esto:

float x = (mPosX*(cos(angle) + sin(angle))/mScaleFactor; 
float y = (mPosY*(cos(angle) - sin(angle))/mScaleFactor; 
m.preTranslate(x, y); 

también hace el objeto de matriz tienen un método para aplicar un affine transformation directamente? Porque entonces no necesitarás pensar sobre el orden de las operaciones.

La transformación afín podría ser algo como esto:

M = |mScaleFactor*cos(angle)  sin(angle)   x| 
    |  -sin(angle)   mScaleFactor*cos(angle) y| 
    |   0       0    1| 

Pero esto va a girar alrededor de la esquina de la imagen por lo que necesita para utilizar la función Pretraducir() primero, así:

Mt.preTranslate(-centerX,-centerY); 

Y APLIQUE Mt a la imagen antes de aplicar M y luego después de que necesite aplicar -Mt

+0

Girar la traducción parece compensar la rotación, pero también tengo la sensación de que esto es lo que necesito re. Las matrices de Android son 3x3, ¿así que supongo que ya son transformaciones afines? – modemuser

+0

¿Entonces tal vez intente configurar la matriz directamente en lugar de usar esos métodos preRotate, preScale? Por lo tanto, su matriz debe ser algo así como la edición en la publicación anterior – Dan

+0

Con esta matriz, la panoramización funciona, pero la escala también rota la imagen, la rotación también escala la imagen y la rotación ocurre alrededor de una esquina de la imagen. Es como whac-a-mole, pero gracias por tu aporte. – modemuser

Cuestiones relacionadas