2010-12-09 4 views

Répondre

0

Vous pouvez utiliser la propriété org.achartengine.chart.PieChart d'aChartEngine qui s'étend sur roundChart.
Pour plus de détails vous pouvez aller à achartengine-0.7.0-javadocs/org/achartengine/chart/PieChart.html

Ce sera disponible lorsque vous téléchargez les javadocs de aChartEngine.org

21

Ci-dessous montre simple diagramme circulaire et vous devez étendre pour plus de fonctionnalités ... valeurs [] et tableau de couleurs doit être égale ....

public class Demo extends Activity { 
    /** Called when the activity is first created. */ 
    float values[]={300,400,100,500}; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     LinearLayout linear=(LinearLayout) findViewById(R.id.linear); 
     values=calculateData(values); 
     linear.addView(new MyGraphview(this,values)); 

    } 
    private float[] calculateData(float[] data) { 
     // TODO Auto-generated method stub 
     float total=0; 
     for(int i=0;i<data.length;i++) 
     { 
      total+=data[i]; 
     } 
     for(int i=0;i<data.length;i++) 
     { 
     data[i]=360*(data[i]/total);    
     } 
     return data; 

    } 
    public class MyGraphview extends View 
    { 
     private Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG); 
     private float[] value_degree; 
     private int[] COLORS={Color.BLUE,Color.GREEN,Color.GRAY,Color.CYAN,Color.RED}; 
     RectF rectf = new RectF (10, 10, 200, 200); 
     int temp=0; 
     public MyGraphview(Context context, float[] values) { 

      super(context); 
      value_degree=new float[values.length]; 
      for(int i=0;i<values.length;i++) 
      { 
       value_degree[i]=values[i]; 
      } 
     } 
     @Override 
     protected void onDraw(Canvas canvas) { 
      // TODO Auto-generated method stub 
      super.onDraw(canvas); 

      for (int i = 0; i < value_degree.length; i++) {//values2.length; i++) { 
       if (i == 0) { 
        paint.setColor(COLORS[i]); 
        canvas.drawArc(rectf, 0, value_degree[i], true, paint); 
       } 
       else 
       { 
         temp += (int) value_degree[i - 1]; 
         paint.setColor(COLORS[i]); 
         canvas.drawArc(rectf, temp, value_degree[i], true, paint); 
       } 
      } 
     } 

    } 
} 
+2

hii je dessine le graphique en utilisant votre code.it fonctionne très bien, mais je hv petit problème.je reçois ling blanc de cordinate d'un côté.so plz me dire quel est le problème? – Google

+0

@Google vous devez réinitialiser la variable "temp" dans OnDraw. J'imagine. – hrules6872

+0

@Ramesh Akula Merci. Ça a marché pour moi. Je voulais afficher du texte à l'intérieur des fragments qui sont créés. Pouvez-vous m'aider s'il vous plaît avec ceci. – codemaniac

4

Fonction de base pour dessiner un graphique à secteurs, l'entrée est un tableau de couleurs et un tableau de valeurs. Les tableaux doivent avoir la même taille. Les tranches sont callulées en fonction des valeurs de chaque diapositive et de la somme de toutes les valeurs. Vous pouvez également utiliser des valeurs flottantes. Cette solution est fournie comme une fonction d'assistance légère. C'est facile à utiliser, et vous n'avez pas besoin de définir une classe pour cela.

public static void drawPieChart(Bitmap bmp, int[] colors, int[] slices){ 
    //canvas to draw on it 
    Canvas canvas = new Canvas(bmp); 
    RectF box = new RectF(2, 2,bmp.getWidth()-2 , bmp.getHeight()-2); 

    //get value for 100% 
    int sum = 0; 
    for (int slice : slices) { 
     sum += slice; 
    } 
    //initalize painter 
    Paint paint = new Paint(); 
    paint.setAntiAlias(true); 

    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeWidth(1f); 
    paint.setStyle(Style.FILL_AND_STROKE); 
    float start = 0; 
    //draw slices 
    for(int i =0; i < slices.length; i++){ 
     paint.setColor(colors[i]); 
     float angle; 
     angle = ((360.0f/sum) * slices[i]); 
     canvas.drawArc(box, start, angle, true, paint); 
     start += angle; 
    } 
} 
+0

fonction de base pour dessiner un graphique à secteurs, l'entrée est un tableau de couleurs et un tableau de valeurs. Les tableaux doivent avoir la même taille. Les tranches sont appelées en fonction des valeurs de chaque diapositive et de la somme de toutes les valeurs. – Waldschrat

+2

Déplacez cette explication dans votre réponse (Il y a un bouton Modifier ci-dessus). Vous voudrez peut-être justifier pourquoi votre réponse est meilleure que celle actuellement acceptée. – Sinkingpoint

+0

salut, c'est bon, comment mettriez-vous du texte avec des pourcentages sur chaque tranche? – user3290180

2

La réponse de Ramesh fonctionne presque correctement. Cependant le pépin blanc à la fin est causé par des erreurs d'arrondi de la coulée float à int. Il suffit de changer le type de "temp" pour flotter, et enlever le cast à (int) à la fin lorsque "temp + = value_degree [i-1]" et c'est parfait.

0

Si vous cherchez quelque chose juste pour tracer un joli graphique alors je vous suggère d'utiliser MPAndroidChart. Si vous cherchez quelque chose de plus léger, vous pouvez l'utiliser.

public class PieDataSet { 

    private List<PieEntry> mPieEntries; 
    private Paint mCurrentPaint; 

    public PieDataSet(List<PieEntry> entries) { 
     mPieEntries = entries; 
     mCurrentPaint = new Paint(); 
    } 

    public void draw(Canvas canvas, float x, float y, float radius){ 

     RectF target = new RectF(x - radius, y - radius, x + radius, y + radius); 

     float startAngle = 0; 
     for(PieEntry entry : mPieEntries){ 
      int arc = (int)(entry.getValue() * 360); 

      mCurrentPaint.setColor(entry.getColor()); 
      canvas.drawArc(target, startAngle, arc, true, mCurrentPaint); 
      startAngle = startAngle + arc; 
     } 
    } 

    public static class PieEntry { 
     private float mValue; 
     private int mColor; 

     public PieEntry(float value, int color){ 
      mValue = value; 
      mColor = color; 
     } 


     //region Getters {} 
     public float getValue() { 
      return mValue; 
     } 

     public int getColor() { 
      return mColor; 
     } 
     //endregion 

     //region Setters {} 
     public void setValue(float mValue) { 
      this.mValue = mValue; 
     } 

     public void setColor(int mColor) { 
      this.mColor = mColor; 
     } 
     //endregion 
    } 
} 

Vous venez de créer une liste de PieDataSet.PieEntry objets, puis créer un PieDataSet. Une fois que vous avez créé votre objet PieDataSet, vous pouvez simplement appeler pieDataSet.draw(canvas, x, y, radius) pour dessiner un camembert sur une toile. Une chose à garder à l'esprit est de s'assurer que vos valeurs de jeu de données totalisent 1.0f (100%), sinon vous n'obtiendrez pas le résultat désiré.

Questions connexes