2012-06-15 4 views
3

J'appelle getDrawingCache dans la fonction onDraw. Le problème est qu'il ne contient les modifications de la toile que la première fois, et après cela, il n'est pas du tout mis à jour avec les nouveaux changements. Voici mon code:getDrawingCache n'est pas mis à jour

 paintAction.draw(canvas); 
     if (paintAction.isPermanentChange()) 
     { 
      Bitmap partialBitmap=getDrawingCache(); 
      int numColored=0; 
      for (int index1=0;index1<partialBitmap.getWidth();index1++) 
      { 
       for (int index2=0;index2<partialBitmap.getHeight();index2++) 
       { 
        if (partialBitmap.getPixel(index1,index2)==0xFF000000) 
         numColored++; 
       } 
      } 
      Log.i("PaintDroid","Bitmap pixels: " + numColored); 
      int areaWidth=partialBitmap.getWidth()-SCROLLBAR_SIZE; 
      int areaHeight=partialBitmap.getHeight()-SCROLLBAR_SIZE; 
      int[] pixels=new int[areaWidth*areaHeight]; 
      partialBitmap.getPixels(pixels,0,areaWidth,0,0,areaWidth, 
        areaHeight);  
      numColored=0; 
      for (int index=0;index<pixels.length;index++) 
       if (pixels[index]==0xFF000000) numColored++; 
      Log.i("PaintDroid","Pixels: " + numColored); 

(setDrawingCache (true) est appelée lorsque la vue est créée, parce que si je l'appelle de onDraw, getDrawingCache renvoie null.)

Comme on peut le voir, je suis compter le nombre de pixels noirs, à la fois en parcourant le bitmap et en obtenant les valeurs dans un tableau, et comme je l'ai dit, je reçois le nombre que je m'attendais pour la première fois, mais après, il était censé augmenter, mais doesn ' t changer du tout!

Quelqu'un a-t-il une idée de ce qui ne va pas? Merci.

Répondre

2

Je l'ai résolu. Le problème était que j'ai appelé setDrawingCacheEnabled (true) avant la dernière opération de dessin sur le canevas dans onDraw. Il doit être appelé après avoir fini de dessiner, sinon vous n'obtiendrez pas de résultats corrects.

-1

Juste pour clarifier, le problème ici est que le cache de dessin de View n'a pas été invalidé avant la deuxième fois que vous appelez getDrawingCache().

Pour que le cache de dessin à rafraîchir doit être invalidée et l'ordre d'appel aux méthodes doivent être les suivantes:

public Bitmap renderView(View view) { 
    view.setDrawingCacheEnabled(true) 
    Bitmap bitmap = view.getDrawingCache(); 
    view.setDrawingCacheEnabled(false) 
    return bitmap; 
} 
+0

Cela ne fonctionnera pas, car il recycle votre bitmap. – janex