2010-04-11 10 views
13

Estoy acostumbrado a manejar gráficos con bibliotecas de la vieja escuela (allegro, GD, pygame), donde si quiero copiar una parte de un mapa de bits en otra ... Solo uso blit.Cómo blit() en android?

Estoy tratando de averiguar cómo hacerlo en Android, y me confundí mucho. Entonces, tenemos estos lienzos que son de solo escritura y los mapas de bits que son de solo lectura. Parece demasiado estúpido para ser real, debe haber algo que me falta, pero realmente no puedo entenderlo.

de edición: para ser más precisos ... si los mapas de bits son de sólo lectura, y el lienzo son de sólo escritura, no puedo blit A en B, entonces B y en C?

Respuesta

17

El código para copiar un mapa de bits en otra es la siguiente:

Rect src = new Rect(0, 0, 50, 50); 
Rect dst = new Rect(50, 50, 200, 200); 
canvas.drawBitmap(originalBitmap, src, dst, null); 

que especifica que desea copiar la esquina superior izquierda (50x50) de un mapa de bits y, a continuación, estirar eso en un mapa de bits de 150x150 y escríbalo 50px offset desde la esquina superior izquierda de su lienzo.

Puede desencadenar el dibujo a través de invalidate(), pero le recomiendo usar SurfaceView si está realizando una animación. El problema con la invalidación es que solo se dibuja una vez que el hilo está inactivo, por lo que no puede usarlo en un bucle, solo dibujaría el último cuadro. Aquí hay algunos enlaces a otras preguntas que he respondido sobre gráficos, podrían ser útiles para explicar a qué me refiero.


En respuesta a los comentarios, aquí hay más información: Si obtiene el lienzo de un SurfaceHolder.lockCanvas(), entonces no creo que pueda copiar los datos residuales que había en él en un mapa de bits. Pero eso no es para lo que sirve ese control: solo lo usa cuando ha resuelto todo y está listo para dibujar.

Lo que se quiere hacer es crear un lienzo que dibuja en un mapa de bits utilizando

Canvas canvas = new Canvas(yourBitmap) 

A continuación, puede hacer lo transformaciones y operaciones de dibujo que desea. yourBitmap contendrá toda la información más reciente. Luego se utiliza el soporte de la superficie de este modo:

Canvas someOtherCanvas = surfaceHolder.lockCanvas() 
someOtherCanvas.drawBitmap(yourBitmap, ....) 

De esta manera siempre tienes yourBitmap que ha toda la información que en ella está tratando de preservar.

+0

Lo siento, todavía no entiendo una cosa: está dibujando en un lienzo, no en un mapa de bits. Como, por lo que yo sé, los lienzos son de solo lectura, no puede dibujar el destino en uno NUEVO. –

+1

Sí, no dibuja directamente en Bitmaps, sino a través de un lienzo. Use algo como esto: 'Bitmap someBitmap = Bitmap.createBitmap (ancho, alto, Bitmap.Config.RGB_565);' para crear un mapa de bits con dimensiones y espacio de color especificados, luego 'Canvas canvas = new Canvas (someBitmap);' para hacer los comandos de dibujo a ese lienzo modifican el mapa de bits. –

+0

entonces, si obtengo el Lienzo de un SurfaceHolder usando lockCanvas, ¿no tengo forma de acceder a ese mapa de bits para leerlo? –

-1

En Android, dibuja en el lienzo, y cuando quieras que lo actualices, llama a invalidar, que redibujará este lienzo a la pantalla. Así que supongo que ha anulado el método onDraw de su vista así que simplemente agregue invalidate();

@Override 
public void onDraw(Canvas canvas) { 
    // Draw a bitmap to the canvas at 0,0 
    canvas.drawBitmap(mBitmap, 0, 0, null); 
    // Add in your drawing functions here 
    super.onDraw(canvas); 
    // Call invalidate to draw to screen 
    invalidate(); 
} 

El código anterior simplemente vuelve a dibujar el mapa de bits constante, por supuesto que desea añadir en cosa extra para dibujar y considerar el uso de una función de temporización que llama a invalidar de manera que no está constantemente en funcionamiento. Aconsejaría echarle un vistazo a las fuentes lunarlander.

+0

sí, pero ¿qué ocurre si quiero dibujar un mapa de bits en otro mapa de bits y publicar el segundo en el lienzo? –

+0

¿Por qué no dibujarlas sobre lienzo? El lienzo no se actualiza hasta que se invoca el invalidate. – stealthcopter