2010-12-09 24 views

Respuesta

0

Puede usar aChartEngine's org.achartengine.chart.PieChart que se extiende roundChart.
Para más detalles se puede ir a achartengine-0.7.0-javadocs/org/achartengine/chart/PieChart.html

Este estará disponible al descargar los javadocs de aChartEngine.org

21

continuación muestra sencilla gráfico circular y que tiene que extenderse durante más características ... valores [] y colores matriz debe ser igual ....

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 dibujo el gráfico usando su código. Funciona muy bien, pero tengo un pequeño problema. Estoy recibiendo ling lingindia de un lado. Así que dígame ¿cuál es el problema? – Google

+0

@Google debe reinicializar la variable "temperatura" en OnDraw. Supongo. – hrules6872

+0

@Ramesh Akula Gracias. Me funcionó. Quería mostrar un texto dentro de los fragmentos que se crean. Puede ayudarme con esto. – codemaniac

4

Función básica para dibujar un gráfico circular, la entrada es una matriz de colores y una matriz de valores. Ellos arreglos deben tener el mismo tamaño. Las rebanadas se calculan en función de los valores de cada diapositiva y la suma de todos los valores. Por supuesto, también puede cambiar a valores flotantes. Esta solución se proporciona como una función de ayuda ligera. Es fácil de usar, y no es necesario definir una clase para ello.

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

función básica para dibujar un gráfico circular, la entrada es una matriz de colores y una matriz de valores. Ellos arreglos deben tener el mismo tamaño. Las divisiones se invocan en función de los valores de cada diapositiva y la suma de todos los valores. – Waldschrat

+2

Mueva esta explicación a su respuesta (Hay un botón de edición arriba). Es posible que desee justificar por qué su respuesta es mejor que la actualmente aceptada. – Sinkingpoint

+0

hola, está bien, ¿cómo pondrías texto con porcentajes en cada porción? – user3290180

2

La respuesta de Ramesh funciona casi bien. Sin embargo, la falla blanca en el extremo es causada por errores de redondeo del flotante de fundición a int. Simplemente cambie el tipo de "temperatura" para flotar, y elimine el molde a (int) al final cuando "temp + = value_degree [i-1]" y es perfecto.

0

Si está buscando algo solo para trazar una bonita tabla, le sugiero que utilice MPAndroidChart. Si estás buscando algo más liviano podrías usar esto.

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 
    } 
} 

Usted acaba de crear una lista de objetos PieDataSet.PieEntry, a continuación, crear una PieDataSet. Una vez que haya creado su objeto PieDataSet, puede simplemente llamar al pieDataSet.draw(canvas, x, y, radius) para dibujar un gráfico circular en un lienzo.

Algo a tener en cuenta es asegurarse de que todos los valores de los conjuntos de datos sumen hasta 1.0f (100%), de lo contrario no obtendrá el resultado deseado.

Cuestiones relacionadas