Android: Cómo girar un mapa de bits en un punto central

He estado buscando más de un día para una solución a este problema, pero nada ayuda, incluso las respuestas aquí. La documentación tampoco explica nada.

Simplemente estoy tratando de obtener una rotación en la dirección de otro objeto. El problema es que el mapa de bits no se gira alrededor de un punto fijo, sino en torno a los mapas de bits (0,0).

Este es el código con el que estoy teniendo problemas:

Matrix mtx = new Matrix(); mtx.reset(); mtx.preTranslate(-centerX, -centerY); mtx.setRotate((float)direction, -centerX, -centerY); mtx.postTranslate(pivotX, pivotY); Bitmap rotatedBMP = Bitmap.createBitmap(bitmap, 0, 0, spriteWidth, spriteHeight, mtx, true); this.bitmap = rotatedBMP; 

La parte extraña es, no importa cómo cambio los valores dentro de pre / postTranslate() y los argumentos float en setRotation() . ¿Puede alguien ayudarme por favor y empujarme en la dirección correcta? 🙂

Espero que la siguiente secuencia de código le ayude:

 Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, config); Canvas canvas = new Canvas(targetBitmap); Matrix matrix = new Matrix(); matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2); canvas.drawBitmap(source, matrix, new Paint()); 

Si comprueba el siguiente método desde ~frameworks\base\graphics\java\android\graphics\Bitmap.java

 public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) 

Esto explicaría lo que hace con la rotación y la traducción.

Editado : código optimizado.

 public static Bitmap RotateBitmap(Bitmap source, float angle) { Matrix matrix = new Matrix(); matrix.postRotate(angle); return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); } 

Para obtener Bitmap de los recursos:

 Bitmap source = BitmapFactory.decodeResource(this.getResources(), R.drawable.your_img); 

Volví a este problema ahora que estamos finalizando el juego y sólo pensé en publicar lo que funcionó para mí.

Este es el método para girar la matriz:

 this.matrix.reset(); this.matrix.setTranslate(this.floatXpos, this.floatYpos); this.matrix.postRotate((float)this.direction, this.getCenterX(), this.getCenterY()); 

( this.getCenterX() es básicamente la posición X de los mapas de bits + el ancho de bitmaps / 2)

Y el método para dibujar el mapa de bits (llamado a través de una clase RenderManager ):

canvas.drawBitmap(this.bitmap, this.matrix, null);

Por lo que es prettey hacia adelante, pero me parece un poco extraño que no pude conseguir que funcione por setRotate seguido de postTranslate . Tal vez alguien sabe por qué esto no funciona? Ahora todos los mapas de bits giran correctamente pero no es sin alguna disminución menor en calidad de mapa de bits: /

De todos modos, gracias por su ayuda!

También puede girar ImageView con un RotateAnimation :

 RotateAnimation rotateAnimation = new RotateAnimation(from, to, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); rotateAnimation.setInterpolator(new LinearInterpolator()); rotateAnimation.setDuration(ANIMATION_DURATION); rotateAnimation.setFillAfter(true); imageView.startAnimation(rotateAnimation); 

Puede utilizar algo como lo siguiente:

 Matrix matrix = new Matrix(); matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2); RectF rectF = new RectF(0, 0, source.getWidth(), source.getHeight()); matrix.mapRect(rectF); Bitmap targetBitmap = Bitmap.createBitmap(rectF.width(), rectF.height(), config); Canvas canvas = new Canvas(targetBitmap); canvas.drawBitmap(source, matrix, new Paint()); 

Mira la muestra de Google llamado Lunar Lander, la imagen de la nave se gira dinámicamente.

Ejemplo de código Lunar Lander

Utilicé estas configuraciones y todavía tengo el problema de la pixelización:

 Bitmap bmpOriginal = BitmapFactory.decodeResource(this.getResources(), R.drawable.map_pin); Bitmap targetBitmap = Bitmap.createBitmap((bmpOriginal.getWidth()), (bmpOriginal.getHeight()), Bitmap.Config.ARGB_8888); Paint p = new Paint(); p.setAntiAlias(true); Matrix matrix = new Matrix(); matrix.setRotate((float) lock.getDirection(),(float) (bmpOriginal.getWidth()/2), (float)(bmpOriginal.getHeight()/2)); RectF rectF = new RectF(0, 0, bmpOriginal.getWidth(), bmpOriginal.getHeight()); matrix.mapRect(rectF); targetBitmap = Bitmap.createBitmap((int)rectF.width(), (int)rectF.height(), Bitmap.Config.ARGB_8888); Canvas tempCanvas = new Canvas(targetBitmap); tempCanvas.drawBitmap(bmpOriginal, matrix, p); 
 matrix.reset(); matrix.setTranslate( anchor.x, anchor.y ); matrix.postRotate((float) rotation , 0,0); matrix.postTranslate(positionOfAnchor.x, positionOfAnchor.x); c.drawBitmap(bitmap, matrix, null); 
  • Gire un botón (o el texto dentro) del código
  • ¿Cómo hacer que el drawableLeft de un Android Button siga girando?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.