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).
- Usando "USER_ROTATION" para API inferior a 11 en Android (solución?)
- La orientación del paisaje bloqueado en la actividad tablet + se inició cuando el dispositivo en vertical = rotación visible en la pantalla
- ¿Cómo puedo hacer que mi Cursor sobreviva a un cambio de orientación?
- Recepción y rotación de la intención de Android
- Android: pinta el mapa de bits en una ubicación específica en un lienzo
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? 🙂
- Cómo obtener los ángulos euler del vector de rotación (Sensor.TYPE_ROTATION_VECTOR)
- Detección de líneas en una imagen de hoja musical en Android
- Habilitar la rotación de la pantalla android
- Dibujable Rotación alrededor de su centro Android
- Android gira el mapa de bits alrededor del centro sin cambiar el tamaño
- Las filas visibles en recyclerview saltan un poco después de girar de retrato a paisaje
- Cómo cambiar la orientación de la pantalla (mediante programación) a "Reverse Landscape" usando appium (driver de selenio)
- Android: Dialog etc restaurar después de la rotación cambiada
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);