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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top