这里画了个饼图的变种,具有分割突出效果的饼图(Pie Chart),就是个切蛋糕效果的饼图,画这种图,其技巧就在于圆心的偏移。
在圆心偏移,半径不变的基础上,效果就出来了。
上图:
怎么样,效果还是有模有样的吧。
代码很简单,附上:
package com.xcl.chart;
/**
* Canvas练习
* 自已绘分割突出效果的饼图(Pie Chart)
*
* author:xiongchuanliang
* date:2014-4-12
*/
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.DisplayMetrics;
import android.view.View;
public class PanelPieChart2 extends View{
private int ScrWidth,ScrHeight;
//演示用的百分比例,实际使用中,即为外部传入的比例参数
private final float arrPer[] = new float[]{20f,30f,10f,40f};
//RGB颜色数组
private final int arrColorRgb[][] = { {77, 83, 97},
{148, 159, 181},
{253, 180, 90},
{52, 194, 188}} ;
//指定突出哪个块
private final int offsetBlock = 2;
public PanelPieChart2(Context context) {
super(context);
// TODO Auto-generated constructor stub
//屏幕信息
DisplayMetrics dm = getResources().getDisplayMetrics();
ScrHeight = dm.heightPixels;
ScrWidth = dm.widthPixels;
}
public void onDraw(Canvas canvas){
//画布背景
canvas.drawColor(Color.WHITE);
float cirX = ScrWidth / 2;
float cirY = ScrHeight / 3 ;
float radius = ScrHeight / 5 ;//150;
float arcLeft = cirX - radius;
float arcTop = cirY - radius ;
float arcRight = cirX + radius ;
float arcBottom = cirY + radius ;
RectF arcRF0 = new RectF(arcLeft ,arcTop,arcRight,arcBottom);
//画笔初始化
Paint PaintArc = new Paint();
Paint PaintLabel = new Paint();
PaintLabel.setColor(Color.WHITE);
PaintLabel.setTextSize(16);
//位置计算类
XChartCalc xcalc = new XChartCalc();
float Percentage = 0.0f;
float CurrPer = 0.0f;
int i= 0;
for(i=0; i<arrPer.length; i++)
{
//将百分比转换为饼图显示角度
Percentage = 360 * (arrPer[i]/ 100);
Percentage = (float)(Math.round(Percentage *100))/100;
//分配颜色
PaintArc.setARGB(255,arrColorRgb[i][0], arrColorRgb[i][1], arrColorRgb[i][2]);
if( i == offsetBlock) //指定突出哪个块
{
//偏移圆心点位置
float newRadius = radius /10;
//计算百分比标签
xcalc.CalcArcEndPointXY(cirX, cirY, newRadius , CurrPer + Percentage/2);
arcLeft = xcalc.getPosX() - radius;
arcTop = xcalc.getPosY() - radius ;
arcRight = xcalc.getPosX() + radius ;
arcBottom = xcalc.getPosY() + radius ;
RectF arcRF1 = new RectF(arcLeft ,arcTop,arcRight,arcBottom);
//在饼图中显示所占比例
canvas.drawArc(arcRF1, CurrPer, Percentage, true, PaintArc);
//计算百分比标签
xcalc.CalcArcEndPointXY(xcalc.getPosX(), xcalc.getPosY(), radius - radius/2/2, CurrPer + Percentage/2);
//标识
canvas.drawText(Float.toString(arrPer[i])+"%",xcalc.getPosX(), xcalc.getPosY() ,PaintLabel);
}else{
//在饼图中显示所占比例
canvas.drawArc(arcRF0, CurrPer, Percentage, true, PaintArc);
//计算百分比标签
xcalc.CalcArcEndPointXY(cirX, cirY, radius - radius/2/2, CurrPer + Percentage/2);
//标识
canvas.drawText(Float.toString(arrPer[i])+"%",xcalc.getPosX(), xcalc.getPosY() ,PaintLabel);
}
//下次的起始角度
CurrPer += Percentage;
}
}
}
代码中只需注意下,指定要突出哪块,就在哪块上指定下偏移即可。
附上我其它绘制的图链接:
Android Canvas练习(5)自已绘面积图(Area Chart)
Android Canvas练习(7)绘制欧冠八强防守&控制率数据对比图
Android Canvas练习(8)自已绘环形图(Dount Chart)
MAIL: xcl_168@aliyun.com
BLOG: http://blog.csdn.net/xcl168