View.onDraw Android () sempre tem uma tela limpa
-
19-09-2019 - |
Pergunta
Eu estou tentando desenhar uma animação. Para fazê-lo Eu tenho estendido Ver e substituído o método onDraw (). O que eu esperaria é que cada vez onDraw () é chamado a tela seria no estado que eu deixei e eu poderia escolher para limpá-la ou apenas desenhar sobre partes dele (É assim que funcionou quando usei um SurfaceView ) mas cada vez que a tela volta já apuradas. Existe uma maneira que eu não posso tê-lo limpo? Ou talvez salvar o estado anterior em um bitmap para que eu possa apenas desenhar que Bitmap e em seguida, desenhar por cima dele?
Solução
Eu não tenho certeza se há uma maneira ou não. Mas para meus pontos de vista personalizados I quer redesenhar tudo cada vez onDraw () é chamado, ou desenhar um bitmap e depois desenhar o bitmap para a tela (como você sugeriu na sua pergunta).
Aqui é como eu fazê-lo
class A extends View {
private Canvas canvas;
private Bitmap bitmap;
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
if (bitmap != null) {
bitmap .recycle();
}
canvas= new Canvas();
bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
canvas.setBitmap(bitmap);
}
public void destroy() {
if (bitmap != null) {
bitmap.recycle();
}
}
public void onDraw(Canvas c) {
//draw onto the canvas if needed (maybe only the parts of animation that changed)
canvas.drawRect(0,0,10,10,paint);
//draw the bitmap to the real canvas c
c.drawBitmap(bitmap,
new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()),
new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), null);
}
}
Outras dicas
Você deve ter um olhar aqui para ver a diferença entre a visão básica e SurfaceView. A SurfaceView tem uma camada dedicada para o desenho, que suponho que mantém o controle do que você desenhou antes. Agora, se você realmente quiser fazê-lo em uma visão básica, você poderia tentar colocar cada item que você desenhar em uma matriz, como o exemple de discriminada sobreposição para o mapview . Ele deve funcionar praticamente da mesma maneira
Suas expectativas não lança w / realidade :) A tela não será do jeito que você deixou, mas em branco em vez. Você poderia criar um ArrayList de objetos a serem desenhados (canvas.drawCircle (), canvas.drawBitmap (etc.)), então iterate que o ArrayList na OnDraw (). Eu sou novo para gráficos programação, mas eu usei isso em uma pequena escala. Talvez haja uma maneira muito melhor.