2016-01-20 2 views
0

Salut Je veux faire une barre de progression Pie dans Android comme l'image ci-jointe ..Pie barre de progression dans Android

enter image description here

je passer par le code suivant, mais aucun gain. J'ai donc décidé d'écrire mon propre ProgressBarView. Voici mon exemple de code ..

public class PieProgressView extends View { 

private float mProgress; 

private int MAX_ANGLE = 360; 


public PieProgressView(Context context) { 
    super(context); 
} 

public PieProgressView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public PieProgressView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
} 



@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    drawOval(canvas); 

} 

public void setProgress(int progress){ 
    mProgress = (float) ((float)progress*3.6); 
    invalidate(); 
} 

private void drawOval(Canvas canvas){ 
    canvas.drawColor(Color.CYAN); 
    Paint paint = new Paint(); 
    // smooths 
    paint.setStyle(Paint.Style.FILL); 
    paint.setColor(Color.RED); 
    RectF oval2 = new RectF(50, 50, 500, 500); 
    canvas.drawOval(oval2, paint);// opacity 

    Paint p = new Paint(); 
    p.setColor(Color.BLACK); 
    canvas.drawArc(oval2, 270, mProgress, true, p); 
    System.out.println("drawOval Progress == "+mProgress); 


    //p.setAlpha(0x80); // 
} 

}

et la classe d'activité de ce que j'appelle ..

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    button = (Button)findViewById(R.id.button); 
    pieProgressView = (PieProgressView)findViewById(R.id.pieprogress); 

    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      fillProgress(); 
     } 
    }); 

} 

private void fillProgress(){ 
    for(int i=0;i<100 ; i++) { 

      pieProgressView.setProgress(i); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 

     } 
    } 
} 

Maintenant, au cours de cette boucle il n'y a pas de progrès démontré, mais bien après pour la boucle il montrera la barre de progression comme dans l'image attachée montrant une progression noire. Quelqu'un peut-il me dire ce qui ne va pas avec ce code

Pourquoi ce code ne fait pas une mise à jour continue?

+0

Est-ce que 'setProgress()' fonctionne correctement sans la boucle? –

+0

@LittleChild oui cela fonctionne sans boucle mais quand je lance la boucle alors il ne se mettra à jour qu'après l'achèvement de la boucle. En fait, dans mon application, je télécharge un fichier du serveur et je veux montrer le dialogue de progression de cette façon. Donc j'utilise pour la boucle pour mettre à jour continuellement la vue. –

Répondre

0

Thread.sleep() provoque le blocage du thread d'interface utilisateur et, par conséquent, le graphique à secteurs "rempli" s'affiche lorsque le thread se réveille. J'ai changé le code pour utiliser un CountDownTimer à la place et cela fonctionne comme un charme. Voici le code:

public class MainActivity extends AppCompatActivity { 
    PieProgressView pie; 
    CountDownTimer timer; 
    int progress = 1; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     pie = (PieProgressView) findViewById(R.id.pie); 
     scheduleNextTimer(); 
    } 

    private CountDownTimer getTimer(){ 
     return new CountDownTimer(1000,1000) { 
      @Override 
      public void onTick(long millisUntilFinished) { 

      } 

      @Override 
      public void onFinish() { 
       Log.d("PROG",progress + ""); 
       pie.setProgress(progress++); 
       scheduleNextTimer(); 
      } 
     }; 
    } 

    private void scheduleNextTimer(){ 
     if(progress < 100){ 
      timer = getTimer(); 
      timer.start(); 
     } 
    } 
} 
+0

Votre solution fonctionne bien .. c'était une erreur froide avec moi. Merci beaucoup. –

+0

@nitintyagi Tout est cool, mec :) –