114 votes

Android, toile: Comment effacer (supprimer le contenu de) une toile (= bitmaps), vivant dans une surfaceView?

J'essaie de faire un jeu simple.

J'ai trouvé (et de l'utiliser) un modèle qui attire une toile avec des bitmaps comme ceci:

private void doDraw(Canvas canvas) {
    for (int i=0;i<8;i++)
        for (int j=0;j<9;j++)
            for (int k=0;k<7;k++)   {
    canvas.drawBitmap(mBits[allBits[i][j][k]], i*50 -k*7, j*50 -k*7, null); } }

(La toile est défini dans "run()" / le SurfaceView vit dans un GameThread.)

Maintenant:

Comment puis-je effacer (ou redessiner) l'ENSEMBLE de la toile pour une nouvelle mise en page (= essayer au jeu) ?
Et: comment puis-je mettre à jour qu'une partie de l'écran ?


MERCI beaucoup pour une pragmatique de l'indice de moi!

(À partir de la navigation sur des sujets à stackoverflow, je pense que beaucoup de gens aimeraient entendre que la réponse...)

// This is the routine that calls "doDraw":
public void run() {
    while (mRun) {
        Canvas c = null;
        try {
            c = mSurfaceHolder.lockCanvas(null);
            synchronized (mSurfaceHolder) {
                if (mMode == STATE_RUNNING) 
                    updateGame();
                doDraw(c);          }
        } finally {
            if (c != null) {
                mSurfaceHolder.unlockCanvasAndPost(c);  }   }   }       }

299voto

Mobistry Points 2902

Dessinez des couleurs transparentes avec le mode clair PorterDuff, faites ce que je voulais.

 Canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)
 

84voto

Wroclai Points 15042

Comment puis-je effacer (ou redessiner) l'ENSEMBLE de la toile pour une nouvelle mise en page (= essayer au jeu) ?

Appelez simplement Canvas.drawColor(Color.BLACK), ou quelle que soit la couleur que vous souhaitez effacer votre Canvas avec.

Et: comment puis-je mettre à jour qu'une partie de l'écran ?

Il n'existe pas de méthode que de simplement mettre à jour une "partie de l'écran" depuis le système d'exploitation Android est en train de redessiner chaque pixel lors de la mise à jour de l'écran. Mais, quand vous n'êtes pas de compensation de vieux dessins sur votre Canvas, le vieux dessins sont toujours à la surface et c'est probablement une façon de "mettre à jour qu'une partie de l'écran.

Donc, si vous voulez mettre à jour une partie de l'écran", il suffit d'éviter appelant Canvas.drawColor() méthode.

37voto

Rukmal Dias Points 1077

Trouvé cela dans les groupes de Google et cela a fonctionné pour moi ..

 Paint clearPaint = new Paint();
clearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawRect(0, 0, width, height, clearPaint); 
 

Cela supprime les rectangles de dessin, etc. tout en conservant la valeur bitmap définie.

20voto

Derzu Points 2463

J'ai essayé la réponse de @mobistry:

canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);

Mais ça n'a pas fonctionné pour moi.

La solution, pour moi, était la suivante:

canvas.drawColor(Color.TRANSPARENT, Mode.MULTIPLY);

Peut-être que quelqu'un a le même problème.

13voto

heMac Points 777
mBitmap.eraseColor(Color.TRANSPARENT);

canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X