在Android中绘制饼图?

我需要绘制饼图(dynamic值)。如何创build图表,而不使用第三方API。

下面显示简单的饼图,你必须扩展更多的function…值[]和颜色数组应该是平等的….

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

绘制饼图的基本function,input是一个颜色数组和一个值数组。 他们的数组必须具有相同的大小。 切片根据每张幻灯片的值和所有值的总和进行调用。当然,您也可以更改为浮点值。 这个解决scheme作为一个轻量级的辅助函数提供。 它很容易使用,而且你不需要为它定义一个类。

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

我有一个相当简单的库,它是开源的,你很可能用它来实现你的目的( https://github.com/saulpower/ExpandablePieChart )。

Ramesh的答案几乎没有问题。 然而,最后的白色毛刺是由从float到int的舍入错误造成的。 只需将“temp”的types改为浮点数,并在“temp + = value_degree [i-1]”时将结尾的types转换为(int),并且是完美的。

你可以使用一个扩展了roundChartorg.achartengine.chart.PieChart引擎的roundChart
有关更多详细信息,你可以去achartengine-0.7.0-javadocs/org/achartengine/chart/PieChart.html

当你从aChartEngine.org下载javadoc时,这个function就可以使用了

如果你正在寻找的东西只是绘制一个漂亮的图表,那么我会build议你使用MPAndroidChart 。 如果你正在寻找更轻量级的东西,你可以使用它。

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

您只需创build一个PieDataSet.PieEntry对象的列表,然后创build一个PieDataSet 。 一旦你创build了PieDataSet对象,你可以调用pieDataSet.draw(canvas, x, y, radius)在canvas上绘制饼图。

需要注意的是确保你的数据集的值都加到1.0f(100%),否则你将不会得到理想的结果。