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:
- Android: los mapas de bits cargados desde la galería se giran en ImageView
- Cómo controla la orientación de la pantalla del dispositivo Android
- Cómo iframe un video de youtube en HTML para teléfonos Android para poder ver y rotar a pantalla completa?
- Fragmentos y problemas con la pantalla giratoria
- Evita la rotación de la pantalla en Android
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?
- Android rotar mapa de bits sin hacer una copia
- Stream de video de autorrotación TextureView en Nexus4 (pero no en Galaxy S4)
- ¿Cómo desactivar la rotación en modo horizontal?
- Recomponer Disposición de actividad para reproducir vídeo en pantalla completa cuando se gira la pantalla
- Cómo usar los datos del sensor onSensorChanged en combinación con OpenGL
- Gire la vista de imagen alrededor de su centro sin cortar sus bordes
- Lienzo dirección drawtext
- Android: Manejo eficiente de la rotación de la pantalla
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();
- Dibujar el texto "elipses" a un lienzo
- Cómo resolver "ADVERTENCIA: La aplicación no especifica un requisito de nivel de API"?