绘制饼状图
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);
大功告成
相关文章推荐
- 简单绘制饼状图
- C#绘制立体三维饼状图(超酷)
- 动态绘制柱状图饼状图
- iOS使用Charts框架绘制—饼状图
- 绘制饼状图(自定义控件)
- Quartz2D简单绘制之饼状图
- Android动态绘制饼状图
- iOS使用Charts框架绘制—饼状图
- IOS之以UIBezierPath绘制饼状图
- Unity3d绘制饼状图
- C# 绘制图表(柱状图,线性图,饼状图)
- 绘制HightCharts饼状图
- 学习使用GDI+绘制饼状图
- 数据质量分析_绘制直方图和饼状图
- Qt绘制饼状图
- Java语言用jfreechart绘制柱状图、饼状图和时序图
- 自定义控件View(三)___绘制饼状图
- [Echarts]用Echarts绘制饼状图
- 【python图像处理】python绘制饼状图
- 利用DevExpress的WebChartControl绘制柱状图,线状图与饼状图示例