在Android中绘制饼图?
答
您可以使用延伸roundChart
的aChartEngine的org.achartengine.chart.PieChart
。
有关详细信息,你可以去achartengine-0.7.0-javadocs/org/achartengine/chart/PieChart.html
当你从aChartEngine.org
答
下载下面的javadoc,这将可以显示简单的饼图,你必须扩展更多的功能...值[]和颜色排列应该是平等的....
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);
}
}
}
}
}
答
绘制饼图的基本函数,输入是颜色数组和值的数组。它们的数组必须具有相同的大小。切片根据每张幻灯片的值和所有值的总和进行调用。当然,您也可以更改为浮点值。 该解决方案作为轻量级帮助函数提供。它很容易使用,而且你不需要为它定义一个类。
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;
}
}
答
Ramesh的答案几乎没有问题。然而,最后的白色小故障是由从float到int的四舍五入造成的。只需将“temp”的类型更改为float,并在“temp + = value_degree [i-1]”结束时将类型转换为(int),并且它是完美的。
答
如果你正在寻找的东西只是绘制一个漂亮的图表,那么我建议你使用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
}
}
你刚才创建PieDataSet.PieEntry
对象的列表,然后创建一个PieDataSet
。一旦你创建了对象PieDataSet
,你可以拨打pieDataSet.draw(canvas, x, y, radius)
在画布上绘制饼图。
需要记住的一点是要确保您的数据集的所有值都加起来为1.0f(100%),否则您将无法获得理想的结果。
hii我使用你的code.its绘制图形工作得很好,但我hv小问题。我得到的白灵在一方的坐标.so plz告诉我最新的问题? – Google 2013-04-18 12:53:56
@Google你应该重新初始化OnDraw中的“temp”变量。我猜。 – hrules6872 2013-06-12 17:30:44