He estado buscando una solución a este problema durante más de un día, 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 gira alrededor de un punto fijo, sino alrededor de los mapas de bits (0,0).
Aquí está el código con el que tengo 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 que no importa cómo cambie los valores dentro de pre
/ postTranslate()
y los argumentos flotantes en setRotation()
. ¿Puede alguien ayudarme y empujarme en la dirección correcta? :)
new
matriz recién editada. Ya es la identidad.Respuestas:
Espero que la siguiente secuencia de código te 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 marca el siguiente método de
~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.
fuente
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 mapa de bits de los recursos:
Bitmap source = BitmapFactory.decodeResource(this.getResources(), R.drawable.your_img);
fuente
Volví a este problema ahora que estamos finalizando el juego y solo pensé en publicar lo que funcionó para mí.
Este es el método para rotar 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 del mapa de bits + el ancho del mapa de bits / 2)Y el método para dibujar el mapa de bits (llamado a través de una
RenderManager
clase):canvas.drawBitmap(this.bitmap, this.matrix, null);
Así que es bastante sencillo, pero me parece un poco extraño que no pude hacerlo funcionar
setRotate
seguido depostTranslate
. ¿Quizás algunos saben por qué esto no funciona? Ahora todos los mapas de bits giran correctamente, pero no sin una pequeña disminución en la calidad del mapa de bits: /¡De todas formas, gracias por su ayuda!
fuente
También puede rotar el
ImageView
usando aRotateAnimation
: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);
fuente
Puede usar 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());
fuente
Mire la muestra de Google llamada Lunar Lander, la imagen de la nave rota dinámicamente.
Ejemplo de código de Lunar Lander
fuente
Usé 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);
fuente
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);
fuente