2016-10-12 1 views
0

Je réalise un dessin sur une toile toutes les 10 sec. Malheureusement, il disparaît avant d'être redessiné, nous avons donc 10 secondes avec un écran vide. Je me suis fatigué pour enregistrer une toile avant de dessiner et de le restaurer, n'a pas aidé. Ce bug est apparu après que j'avais décalé une ligne canvas.drawPath(linePath, linePaint); de l'extérieur d'une boucle dans la boucle.Pourquoi mon dessin disparaît-il d'une toile?

CODE:

private void drawLine(Canvas canvas) { 
     yStep = (yHeight)/fullChargeLevel; 
     xStep = (xWidth)/timeStampBarsQuantity; 

     boolean check = false; 
     float time; 
     float chrg; 

     while (batteryUsageHistory != null && batteryUsageHistory.moveToNext()) { 
      int charge = batteryUsageHistory.getInt(1); 
      int time_stamp = batteryUsageHistory.getInt(2); 

      if (charge < 1) { 

       if(check){ 
        canvas.drawPath(linePath, linePaint); //This line I shifted into here 
        linePath.reset(); 
       } 

       check = false; 

       continue; 
      } 

      time = xPos + time_stamp * xStep; 
      chrg = yPos - (charge * yStep); 

      if (!check) { 
       linePath.moveTo(time, chrg); 
       check = true; 

       continue; 
      } 
      linePath.lineTo(time, chrg); 
     } 
     //canvas.drawPath(linePath, linePaint); //This line I shifted from here 
    } 
+1

Vous obtenez un nouveau 'Bitmap' à partir duquel vous devriez créer un nouveau' Canvas' dans chaque appel 'onDraw', et dessinez sur ce canvas au lieu de sauvegarder l'ancien, ou dessinez simplement sur le nouveau Canvas fourni par la méthode 'onDraw (Canvas newCanvas)'. – Shark

+0

@Shark merci, votre réponse m'a mis dans une bonne façon de penser. Je viens de reculer cette ligne 'canvas.drawPath (linePath, linePaint);' J'ai déjà été déplacé. – Mikhail

+1

L'enregistrement/restauration de canvas n'est pas fait pour l'enregistrer pour une utilisation ultérieure - il est principalement utilisé avant d'appliquer une transformation/rotation, de faire quelque chose, puis de le restaurer en un seul appel onDraw(). – Shark

Répondre

1

Je viens de reculer cette ligne canvas.drawPath(linePath, linePaint); J'ai été précédemment déplacé. Et il fonctionne!.

1

Vous devez mettre en œuvre la logique de votre dessin onDraw en étendant une Voir classe:

protected void onDraw(Canvas canvas) { 
    // here goes your custom drawing logic 
} 

comme indiqué dans: https://developer.android.com/training/custom-views/custom-drawing.html

c'est parce que Android redessine le composant quand il le faut. C'est toujours comme ça que vous devez implémenter la méthode de dessin et le framework GUI appellera cette méthode quand c'est nécessaire, ce n'est pas le contraire, le framework GUI affiche votre peinture, il appelle simplement votre méthode de peinture quand vous en avez besoin.

+0

Merci pour votre réponse, mais j'ai fait 'public class ChartView extends View implémente BatteryChargeChangeListener {.//some code ..}', et j'ai la méthode 'onDraw' qui appelle' private void drawLine (Canvas canvas) '. – Mikhail

+0

s'il vous plaît puis montrer votre code, sans cela, je ne pouvais pas vous aider :) –

+0

S'il vous plaît vérifier ce https://codeshare.io/adYlh – Mikhail