您的位置:首页 > 移动开发 > Android开发

绘制饼状图

2017-08-01 16:44 204 查看

绘制一个顺序添加的饼状图(备注:顺时针添加)

首先先上效果图



下面是相关的实体类

public class MyPieData {

private float value;  //传进来的数值

private float angle;  //当前数值对应角度

private int color;  //画笔颜色

private float percentage;

private String name;

public MyPieData( String name,float value) {
this.value = value;
this.name = name;
}

public float getPercentage() {
return percentage;
}

public void setPercentage(float percentage) {
this.percentage = percentage;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getColor() {
return color;
}

public void setColor(int color) {
this.color = color;
}

public float getAngle() {
return angle;
}

public void setAngle(float angle) {
this.angle = angle;
}

public float getValue() {
return value;
}

public void setValue(float value) {
this.value = value;
}
}


然后是自定义View代码

public class MyPieChart extends View {

private int[] mColors = {0xFFFF0000,  0xFFF7C709, 0xFFF7F709, 0xFF97F709, 0xFF22DDB8,0xFF1A94E6,0xFF4D2BD5,0xCC00FF};

private Paint paint;

private Paint textPaint;

private int width,height;

private float resetStartAngle;

private RectF rect;//弧形的绘制区域

private List<MyPieData>list;

private int size;
private int myPieNum;

private float r;

private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (myPieNum<size){
myPieNum++;
invalidate();
sendEmptyMessageDelayed(0,50*myPieNum);

}
}
};

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
width=w;
height=h;
r= (float) (Math.min(width,height)/2*0.6);
rect=new RectF(-r,-r,r,r);
}

public MyPieChart(Context context) {
this(context,null);
}

public MyPieChart(Context context, AttributeSet attrs) {
super(context, attrs);
paint=new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);

textPaint=new Paint();
textPaint.setAntiAlias(true);
textPaint.setColor(Color.BLACK);
textPaint.setTextSize(16);

}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.translate(width/2,height/2);

int count=0;
float startAngle=resetStartAngle;
float sweepAngle;
if (list!=null){
while (count<myPieNum){
MyPieData myPieData=list.get(count);
sweepAngle=myPieData.getAngle();
paint.setColor(myPieData.getColor());
canvas.drawArc(rect,startAngle,sweepAngle,true,paint);
String text=myPieData.getName()+"="+myPieData.getPercentage()+"%";
//将文字绘制在弧形的中点,所以sweepAngle/2
float x=(float)Math.cos((sweepAngle/2+startAngle)/360*2*Math.PI)*(r+20);
float y=(float)Math.sin((sweepAngle/2+startAngle)/360*2*Math.PI)*(r+20);
canvas.drawText(text,x,y,textPaint);
startAngle+=sweepAngle;
count++;
}

}

}

public void setStartAngle(float startAngle){
resetStartAngle=startAngle;
}

public void setData(List<MyPieData> list){
this.list=list;
initData();
myPieNum=1;
invalidate();
handler.sendEmptyMessageDelayed(0,50);
}

private void initData() {
size=list.size();
float count=0;

for (int i=0;i<size;i++){
MyPieData myPieData=list.get(i);
count+=myPieData.getValue();
}

for (int i=0;i<size;i++){
MyPieData myPieData=list.get(i);
float percentage= myPieData.getValue()/count;
float angle=360*percentage;
myPieData.setAngle(angle);
myPieData.setColor(mColors[i]);
DecimalFormat fmt=new DecimalFormat("0.##");//建立一个输出格式最多为小数点后两位的模板
myPieData.setPercentage(Float.valueOf(fmt.format(percentage)));
}

}

}


在布局中引用

<com.example.mytestapplication.widget.MyPieChart
android:id="@+id/myPidChart"
android:layout_width="match_parent"
android:layout_height="match_parent"/>


给MyPieChart添加数据

MyPieChart myPieChart=(MyPieChart)findViewById(R.id.myPidChart);
myPieChart.setStartAngle(30);

List<MyPieData>list=new LinkedList<>();
MyPieData myPieData=new MyPieData("a",10);
list.add(myPieData);

myPieData=new MyPieData("b",20);
list.add(myPieData);

myPieData=new MyPieData("c",30);
list.add(myPieData);

myPieData=new MyPieData("d",10);
list.add(myPieData);

myPieData=new MyPieData("e",20);
list.add(myPieData);

myPieData=new MyPieData("f",35);
list.add(myPieData);

myPieData=new MyPieData("g",15);
list.add(myPieData);

myPieChart.setData(list);


大功告成
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息