2011-02-25 9 views
9

Espero que los métodos saveLayer me permitan dibujar en diferentes "capas" y luego, una vez que el dibujo haya terminado, combine las capas con el lienzo en el orden que elija.Comprensión de Canvas.saveLayer de Android (...)

La pregunta obvia es "¿por qué simplemente no reorganizas tus operaciones de dibujo?" La respuesta es que no puedo:

Tengo un camino que necesito dibujar en un lienzo. En el fondo/índice z más bajo, quiero dibujar el camino cerrado y con algunos puntos adicionales usando un estilo de relleno. Luego, además de eso, quiero dibujar un esquema de solo los puntos que originalmente estaban en el Camino.

Como no puedo deshacer la adición de puntos a la ruta, mis únicas opciones son clonar la ruta o dibujar una segunda capa que luego se puede colocar encima de todo lo demás.

saveLayer() parece ofrecer esa funcionalidad, pero no se comporta de la manera que esperaba. El flujo básico de mis operaciones es la siguiente:

int overlay = canvas.saveLayer(...); 
// drawing operations for my uppermost layer 
... 

int background = canvas.saveLayer(...); 
// drawing operations for my background layer 
... 

// merge the offscreen background bitmap with the canvas: 
canvas.restoreToCount(background); 

// merge the offscreen overlay bitmap with the canvas: 
canvas.restoreToCount(overlay); 

Cuando se ejecuta el código, el orden de superposición de fondo y no han cambiado en absoluto; lo que se dibuja primero está en la parte inferior y lo que se dibuja al final está en la parte superior. Aún más extraño para mí es que puedo comentar por completo ambas llamadas a restoreToCount() y nada cambia. De acuerdo con el javadoc, nada debe dibujarse en el lienzo hasta que se invoque una restauración de equilibrio().

Obviamente estoy completamente mal entendiendo la función de este método. ¿Alguien puede ayudarme a comprender el uso de saveLayer, o quizás sugerir una forma alternativa de superponer mis operaciones de dibujo?

Thx! Nick

Respuesta

8

saveLayer() no le permite reorganizar las capas en un orden aleatorio. La única manera de hacerlo es dibujar bitmaps fuera de pantalla. Tenga en cuenta también que el padre de su vista llamará a save()/restore() alrededor de su llamada a onDraw(), lo que hará que sus capas sean compuestas.

+0

Eso lo resuelve entonces. Gracias. – Nick