این کلاس را به پروژه اضافه کنید و در قسمت CustomView یک PieChartView به صفحه اضافه کنید و به اون یک آیدی اختصاص بدین بعد متد setDatas رو برای اون آیدی صدا بزنین و اطلاعات هر آیتم رو به صورت یک مجموعه از BasicNameValuePair ها بهش بدین که قسمت اول اسم اون آیتم و قسمت دوم ارزش اون آیتم هست که باید یک عدد باشه ولی داخل یک رشته استرینگ بریزینش فقط برای ویو به اندازه کافی ارتفاع در نظر بگیرین تا مشکل نداشته باشه یا بذارینش داخل یک scrollView
اسنیپ
source+
package your.package;
import java.util.ArrayList;
import org.apache.http.message.BasicNameValuePair;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.widget.ImageView;
public class PieChartView extends ImageView {
private float allDataValues;
private int[] colors;
private Paint paint;
private int interval;
private RectF rect;
private boolean isFirstDraw = true;
private static int data_count;
private static ArrayList<BasicNameValuePair> datas = new ArrayList<BasicNameValuePair>();
private ArrayList<Arc> arcs = new ArrayList<PieChartView.Arc>();
private int currentArcIndex = 0;
private class Arc {
private float startAngle;
private float sweepAngle;
private int color;
private String percent;
}
public PieChartView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initialize();
}
public PieChartView(Context context, AttributeSet attrs) {
super(context, attrs);
initialize();
}
public PieChartView(Context context) {
super(context);
initialize();
}
public void setDatas(ArrayList<BasicNameValuePair> values) {
datas = values;
data_count = values.size();
if (data_count > 0) {
allDataValues = 0;
for (int i = 0; i < data_count; i++) {
allDataValues += Float.parseFloat(datas.get(i).getValue());
}
float lastSweeped = 0;
for (int i = 0; i < data_count; i++) {
Arc arc = new Arc();
arc.startAngle = lastSweeped;
float number = Float.parseFloat(datas.get(i).getValue());
arc.sweepAngle = number / allDataValues * 360F;
arc.percent = String.format("%.0f", arc.sweepAngle / 360 * 100) + " %";
arc.color = colors[i];
arcs.add(arc);
lastSweeped += arc.sweepAngle;
}
}
}
private void startShownigThisArc() {
new Thread(new Runnable() {
@Override
public void run() {
for (final Arc arc: arcs) {
final float finalsweep = arc.sweepAngle;
arc.sweepAngle = 0;
for (float i = 0; i <= finalsweep + 1; i++) {
try {
Thread.sleep(3);
arc.sweepAngle = i;
if (arc.sweepAngle >= finalsweep) {
arc.sweepAngle = finalsweep;
}
postInvalidate();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
currentArcIndex++;
}
}
}).start();
}
private void initialize() {
colors = new int[]{ Color.YELLOW, Color.LTGRAY, Color.RED, Color.CYAN, Color.MAGENTA, Color.BLUE, Color.GRAY, Color.GREEN, Color.DKGRAY, Color.YELLOW, Color.LTGRAY, Color.RED, Color.CYAN, Color.MAGENTA, Color.YELLOW, Color.LTGRAY, Color.RED, Color.CYAN, Color.MAGENTA, Color.BLUE, Color.GRAY, Color.GREEN, Color.DKGRAY, Color.YELLOW, Color.LTGRAY, Color.RED, Color.CYAN, Color.MAGENTA };
interval = 30;
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
paint.setStyle(Style.FILL);
paint.setTextAlign(Align.RIGHT);
paint.setTextSize(15);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
rect = new RectF(interval, interval, getWidth() - interval, getWidth() - interval);
paint.setColor(Color.WHITE);
canvas.drawCircle(rect.centerX(), rect.centerY(), rect.width() / 2 + 5, paint);
for (int i = 0; i < data_count; i++) {
float x = getWidth() - 10 - 30 - 30; // size of qure-padding-size of percenct text
float y = getWidth() - (interval) + i * 20 + 30;
paint.setColor(arcs.get(i).color);
if ( !isFirstDraw) {
if (currentArcIndex >= i) {
canvas.drawArc(rect, arcs.get(i).startAngle, arcs.get(i).sweepAngle, true, paint);
}
}
canvas.drawRect(x + 10, y - 10, x + 20, y, paint);
paint.setTextAlign(Align.RIGHT);
canvas.drawText(datas.get(i).getName(), x, y, paint);
paint.setTextAlign(Align.LEFT);
canvas.drawText(arcs.get(i).percent, x + 25, y, paint);
}
if (isFirstDraw) {
isFirstDraw = false;
startShownigThisArc();
}
}
}