根据前面写的 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);
- }
- }