Question

Je suis en train de dessiner une animation. Pour ce faire, je l'ai étendu View et réécrite la méthode onDraw (). Ce que je me attends à ce que chaque fois onDraw () est appelée la toile serait dans l'état où je l'ai laissé et je pouvais choisir de l'effacer ou juste tirer sur les parties (Voilà comment cela a fonctionné quand je un SurfaceView ), mais à chaque fois que la toile revient déjà effacé. Est-il possible que je ne peux pas l'avoir effacé? Ou peut-être sauver l'état précédent dans un Bitmap donc je peux tirer cette Bitmap puis tirer sur le dessus de celui-ci?

Était-ce utile?

La solution

Je ne sais pas s'il y a un moyen ou non. Mais pour mes vues personnalisées je redessine soit tout à chaque fois onDraw () est appelée, ou dessiner un bitmap puis dessinez le bitmap sur la toile (comme vous le suggérez dans votre question).

Voici comment je le fais

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);
    }
}

Autres conseils

vous devriez regarder ici pour voir la différence entre la vue de base et surfaceView. Une surfaceView a une couche dédiée pour le dessin, que je suppose que garde la trace de ce que vous avez dessiné avant. Maintenant, si vous voulez vraiment le faire sur une vue de base, vous pouvez essayer de mettre chaque élément que vous dessinez dans un tableau, comme l'exemple de pour la superposition détaillée MapView. Il devrait fonctionner à peu près de la même façon

Vos attentes ne Jib pas w / réalité :) La toile ne sera pas la façon dont vous l'avez laissée, mais vide au lieu. Vous pouvez créer un ArrayList d'objets à tirer (canvas.drawCircle (), canvas.drawBitmap (), etc.), alors que le itérer ArrayList dans le OnDraw (). Je suis nouveau à la programmation graphique, mais je l'ai utilisé cela sur une petite échelle. Peut-être il y a un moyen beaucoup mieux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top