Sprite Rotación en Android con Canvas.DrawBitmap. Estoy cerca, ¿qué estoy haciendo mal?

Tengo este algoritmo giratorio del sprite (su mal nombrado y apenas utilizado para la prueba). Está tan cerca, los sprites dibujados con ella giran. Cada marco puedo añadir +5 grados a él y ver mi pequeño sprite poco girar alrededor. El problema es que las otras cosas dibujadas en el lienzo parpadean. Si no hago la rotación los sprites dibujados regulares funcionan muy bien. Creo que estoy cerca, pero no sé qué pieza me falta. A continuación se presentan mis dos métodos "Draw_Sprite", uno sólo dibuja el mapa de bits previamente cargado de recursos para el lienzo pasado. El otro, hace alguna rotación lo mejor que sé cómo girar el sprite por tan x muchos grados … y luego dibujar . Si tengo un bucle de juego agradable que dibuja varios objetos, un tipo es el tipo rotado. Entonces los sprites no girados parpadean y, sin embargo, el sprite girado nunca lo hace. Aunque si dibujo los sprites no girados primero, todo está bien, pero entonces la Ordenación Z podría estar desordenada (sprites encima de los elementos de la interfaz de usuario, etc.) … Las definiciones del método:

/************************************************* * rotated sprite, ignore the whatever, its for ease of use and testing to have this argument list * @param c canvas to draw on. * @param whatever ignore * @param rot degrees to rotate * @return */ public int Draw_Sprite(Canvas c, int whatever, int rot) { //rotating sprite Rect src = new Rect(0, 0, width, height); Rect dst = new Rect(x, y, x + width, y + height); Matrix orig = c.getMatrix(); mMatrix = orig; orig.setTranslate(0, 0); orig.postRotate(rot, x+width/2, y+height/2); c.setMatrix(orig); c.drawBitmap(images[curr_frame], src, dst, null); c.setMatrix(mMatrix); //set it back so all things afterwards are displayed correctly. isScaled=false; return 1; } /******************************************************** * draw a regular sprite to canvas c * @param c * @return */ public int Draw_Sprite(Canvas c) { Rect src = new Rect(0, 0, width, height); Rect dst = new Rect(x, y, x + width, y + height); c.drawBitmap(images[curr_frame], src, dst, null); isScaled=false; return 1; } 

Y ahora el uso:

 void onDraw(Canvas c) { canvas.drawRect( bgRect, bgPaint); //draw the background //draw all game objects // draw the normal items for (GameEntity graphic : _graphics) { graphic.toScreenCoords((int)player_x, (int)player_y); if(graphic.getType().equals("planet")) //draw planets graphic.Draw_Sprite(canvas); //before the rotation call draws fine else { //rotate all space ships every frame so i see them spinning //test rotation mRot +=5; if(mRot>=360) mRot=0; graphic.Draw_Sprite(canvas, 0, mRot); //yes function name will be better in future. this rotates spins draws fine } } thePlayer.Draw_Sprite(canvas); //FLICKERS drawUI(canvas);//all things here flickr } 

Así que lo hace, las cosas después de una llamada a un sorteo de rotación se dibujan correctamente. Pero el problema es que flickrs. Ahora uno podría decir que debo hacer todo mi material no rotatorio y guardar el último, pero el zordering estaría apagado …. sugerencias sobre cómo abordar este tema de zordering o el parpadeo?

Intente usar canvas.save () antes de la rotación y canvas.restore () después de que la manipulación esté completa.

Cuando se realizan manipulaciones en el lienzo para cambiar la forma en que se dibuja un objeto, hay que recordar el conjunto de manipulaciones de cómo el lienzo maneja los orígenes, etc … Por lo tanto, si traduce o gira el lienzo, se establecerá durante la vida de ese lona. Para evitar esto, primero llama a guardar, que guarda una instantánea de la matriz de lienzo antes de manipularla, luego ejecuta todos los cambios y, a continuación, restauración de llamada que restaura el lienzo al último punto guardado. De lo contrario, todos sus cambios se acumulan y obtendrá resultados no deseados.

Sólo para el próximo chico que puede leer esto. Puede hacerlo con sólo unas pocas líneas de código:

 canvas.save(); canvas.rotate(rotation_angle, x + (widthofimage / 2), y + (heightofimage / 2)); canvas.drawBitmap(bitmap, x, y, null); canvas.restore(); 
  • Cómo rotar un mapa de bits en Android acerca de imágenes de forma suave sin movimiento oscilatorio
  • Cómo evitar reiniciar la actividad cuando cambia la orientación en Android
  • Android: gira la imagen en ImageView por 90degrees pero sin demora
  • Rotar imagen junto con toque para fijar punto en android
  • Texto de vista de texto de android en dirección vertical
  • Rotate jpeg utilizando ExifInterface no funciona a veces
  • Obtener información de rotación automática en Android
  • Rotar una imagen varias veces pero mantener las esquinas alineadas
  • Android: gira la imagen en la vista de la imagen por un ángulo
  • Obtener nueva posición de coordenadas después de la rotación con Matrix
  • Establecer vista de imagen después del cambio de orientación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.