«

»

oct 10 2011

Como voltear/reflejar una imagen por código

Imagen volteada

En este tutorial os vamos a enseñar como voltear una imagen antes de mostrarla en un ImageView, para ello usaremos matrices y se la aplicaremos a un Bitmap antes de mostrarlo.

Para empezar debemos crear un array especificando que coordenadas queremos voltear:

1
2
3
float[] mirrorX = { 1, 0, 0, 0, -1, 0, 0, 0, 1 }; // Para voltear la imagen sobre el eje X (reflejo en el suelo)
float[] mirrorY = { -1, 0, 0, 0, 1, 0, 0, 0, 1 }; // Para voltear la imagen sobre el eje Y (reflejo en una pared)
float[] mirrorXY = { -1, 0, 0, 0, -1, 0, 0, 0, 1 }; // Para voltear la imagen sobre ambos ejes

El siguiente paso será generar una matriz con el array que queramos usar (yo voy a usar el segundo):

1
2
Matrix matrixMirror = new Matrix();
matrixMirror.setValues(mirrorY);

Con la matriz de valores ya creada vamos a crear la matriz de transformación, que será la que realmente aplicaremos a nuestra imagen:

1
2
Matrix matrix = new Matrix();
matrix.postConcat(matrixMirror);

Ahora que tenemos la matriz ya creada vamos a crear un Bitmap y a aplicarsela:

1
2
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon); // Generamos un Bitmap leyendo directamente un recurso de nuestra aplicación
Bitmap mirrorBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); // Creamos un nuevo Bitmap aplicando la matriz creada anteriormente

Llegados a este punto ya sólo falta mostrar el Bitmap en un ImageView para ver el resultado:

1
2
ImageView imageView = (ImageView) findViewById(R.id.imgMirror);
imageView.setImageBitmap(mirrorBitmap);

Y con esto terminamos el tutorial, si quereis el codigo de la aplicación podéis descargarlo desde aquí.

 

Acerca del autor

Kix2902

Programador vocacional, geek y twittero de pro. Cofundador de @RedInput. Y sobre todo Fandroid moderado.

  • http://www.pixhunting.es Carlos

    Buen manual, pero hay manera de hacerlo sin bitmap?

    • http://www.linkedin.com/in/jmpergar JMPergar | Editor Jefe

      ¿A que te refieres? ¿Puedes explicarte mejor? ;)

      • http://www.pixhunting.es Carlos

        Sip, te cuento. Aunque en su día lo arregle usando bitmap.recycle(); para liberar, y hasta ayer iba bien. Pero al probar el código en el note de ya sabes quién… da un outofmemory precioso. al crear el segundo bitmap. Y estoy buscando soluciones. Probe llamar al System.gc(); pero ni por esas. Se os ocurre algo? ;-))