根据前面写的 canvas 和paint的一些用法,
现在就把原来写过的项目中的东西的 一些原始基本代码拿出来记录下。很多功能可以自己在基础上添加,
先来张效果图吧。PS: 这里只是简单的思路代码,其实饼图可以点击后实现点击效果
部分代码:
/**
* 画饼图类
*/
@SuppressLint("ViewConstructor")
public class PieView extends View {
int areaX = 1;
int areaY = 22;
//饼图的宽高
private int areaWidth = 360;
private int areaHight = 300;
//颜色数组
private int[] colors =new int[]{
Color.rgb(54,217,169),Color.rgb(0,171,255),Color.rgb(80,195,252),Color.rgb(13,142,207),
Color.rgb(2,211,21),Color.rgb(176,222,9),Color.rgb(248,255,1),Color.rgb(252,210,2),
Color.rgb(255,159,13),Color.rgb(255,100,0),Color.rgb(234,14,0),
};
//阴影数组
private int[] shade_colors = new int[]{
Color.rgb(26,164,123),Color.rgb(0,154,230),Color.rgb(21,178,255),Color.rgb(5,102,153),
Color.rgb(3,147,15),Color.rgb(124,158,8),Color.rgb(212,218,2),Color.rgb(219,183,6),
Color.rgb(214,135,5),Color.rgb(210,90,13),Color.rgb(199,13,1),
};
//区域百分比
private int percent[];
private String title;
private int thickness= 20;
float x, y;
//默认可响应点击事件
private boolean isOntouch= true;
//下面的图例文字
private String[] info;
//点击事件的计算
private float centerX;
private float centerY;
private Context context;
//图例文字的pain
private Paint legendPaint;
//饼图的paint
private Paint mainPaint;
//默认显示右边
private WHERE where = WHERE.right;
public static enum WHERE{
right ,bottmo
}
/**
* @param context
* @param colors 最上面颜色数组
* @param shade_colors 阴影颜色数组
* @param percent 百分比 (和必须是360)
*/
public PieView(Context context,int[] percent, String[] info) {
super(context);
this.percent = percent;
this.context = context;
this.info = info;
initPaint();
}
//初始化 画笔
private void initPaint(){
legendPaint = new Paint();
legendPaint.setColor(Color.BLACK);
legendPaint.setStrokeWidth(1f);
mainPaint = new Paint();
mainPaint.setStyle(Style.FILL);
mainPaint.setAntiAlias(true);
}
//设置饼图的大小 这里已经给了默认大小了
public void setSize(int areaWidth ,int areaHight){
this.areaWidth = areaWidth;
this.areaHight = areaHight;
}
//饼图的标题
public void setTitle(String title){
this.title = title;
}
public void setWhere(WHERE s){
this.where = s;
}
public void setThickness(int thickness) {
this.thickness = thickness;
areaY=thickness+2;
this.invalidate();
}
// 主要访法
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//开画
for(int i=0;i <= thickness;i++){
int tempAngle=0;
for(int j=0;j< percent.length;j++){
//画笔的颜色
mainPaint.setColor(shade_colors[j]);
//坐标点 start end
RectF rectF = new RectF(areaX, areaY-i, areaX+areaWidth, areaHight-i);
//画弧
canvas.drawArc(rectF, tempAngle,percent[j], true, mainPaint);
tempAngle+=percent[j];
}
//开始画图例区域
if(i == thickness ){
RectF rectF = new RectF(areaX, areaY- thickness, areaX + areaWidth, areaHight- thickness);
centerX = rectF.centerX();
centerY = rectF.centerY();
int temp = areaHight + 20/* height-320*/;
for(int j=0;j<percent.length;j++){
mainPaint.setColor(colors[j]);
canvas.drawArc(rectF , tempAngle,percent[j], true, mainPaint);
tempAngle+=percent[j];
//说明区域
RectF rect = new RectF(areaX, temp, areaX+40, temp-10);//标识区域
canvas.drawText(info[j], areaX+60, temp, legendPaint);
canvas.drawRect(rect, mainPaint);
temp += 25;
}
}
}
//
for (int i = 0; i < colors.length; i++) {
if (isOntouch) {
isOntouch = false;
System.out.println(centerX + "" + centerY);
double d = Math.atan2(y-centerY, x-centerX)*180/Math.atan2(0.0, -1.0);
if (d < 0) {
d = 360 + d;
}
int temp = 0;
for (int j = 0; j < percent.length; j++) {
Log.e(Float.toString(y), Float.toString(areaHight));
if (d >temp && d < percent[j]+temp && y < areaHight) {
System.out.println(" " + colors[j]);
// context.startActivity(it);
Toast.makeText(context, "colors[j]="+ colors[j]
+ "----x,y="+ x+","+y
+"--temp="+ temp,
1000).show();
}
temp += percent[j];
}
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
isOntouch = true;
x = event.getX();
y = event.getY();
invalidate();
}
return true;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}