绘制饼状图

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

首先先上效果图
这里写图片描述

下面是相关的实体类

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

大功告成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值