2011-06-30 8 views
5

¿Cómo se puede hacer esto? ¿Podría alguien darme un bosquejo?Doble búfer en Java en Android con canvas y surfaceview

Por lo que he encontrado en Internet, parece que en mi run() función:

  1. crear un mapa de bits
  2. crear un lienzo y adjuntarlo al mapa de bits
  3. lockCanvas()
  4. sorteo de llamadas (lienzo) y dibujar mapas de bits en la memoria tampón posterior (cómo ??)
  5. unlockCanvasAndPost()

¿Es esto correcto? Si es así, ¿podría obtener una pequeña explicación? ¿Qué significan estos pasos y cómo los implemento? Nunca he programado para Android antes, así que soy un verdadero novato. Y si no es correcto, ¿cómo lo hago?

Respuesta

16

Ya tiene doble buffer, eso es lo que hace la llamada a unlockCanvasAndPost(). No es necesario crear un mapa de bits.

+0

No lo entiendo del todo. Entonces, dibujo todo lo que necesito entre bloquear y desbloquear y ... ¿el doble buffer ocurre por sí mismo? ¿No necesito también dibujar ANTES de bloquear? Lo siento, necesito que esto se explique de la manera más básica posible ... – Kalina

+7

@TheBeatlemaniac: cuando estás dibujando en un 'Lienzo' después de que se ha llamado a 'candadoCanvas()', en realidad estás dibujando cosas en el * siguiente * fotograma, mientras se visualiza el fotograma * actual *. Una llamada 'unlockCanvasAndPost()' cambiará el siguiente búfer de cuadros con el búfer de cuadros actual para mostrar un 'Canvas' actualizado. – Wroclai

+0

La parte de mapa de bits es útil si desea acercarse/alejarse y mover su "espacio de trabajo". – TheRealChx101

2

Los pasos de Android Developers Group dicen que necesita un lienzo de búfer, al que se dibujan todos los renders.

Bitmap buffCanvasBitmap; 
Canvas buffCanvas; 

// Creating bitmap with attaching it to the buffer-canvas, it means that all the changes // done with the canvas are captured into the attached bitmap 
tempCanvasBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); 
tempCanvas = new Canvas(); 
tempCanvas.setBitmap(tempCanvasBitmap); 

// and then you lock main canvas 
canvas = getHolder().lockCanvas();    
// draw everything you need into the buffer 
tempCanvas.drawRect.... // and etc 
// then you draw the attached bitmap into the main canvas 
canvas.drawBitmap(tempCanvasBitmap, 0, 0, drawView.getPaint()); 
// then unlocking canvas to let it be drawn with main mechanisms 
getHolder().unlockCanvasAndPost(canvas); 

que está recibiendo el búfer principal, que está dibujando en diferentes sin conseguir tela de doble buffer de bloqueo de cada soporte.