android 自定义 3D 饼图

根据前面写的 canvas 和paint的一些用法,

现在就把原来写过的项目中的东西的 一些原始基本代码拿出来记录下。很多功能可以自己在基础上添加,

先来张效果图吧。PS: 这里只是简单的思路代码,其实饼图可以点击后实现点击效果



部分代码:

[java]  view plain copy
  1. /** 
  2.  *  画饼图类 
  3.  */  
  4. @SuppressLint("ViewConstructor")  
  5. public class PieView extends View {  
  6.       
  7.     int areaX = 1;  
  8.     int areaY = 22;  
  9.       
  10.     //饼图的宽高  
  11.     private int areaWidth = 360;     
  12.     private int areaHight = 300;  
  13.          
  14.     //颜色数组  
  15.     private int[] colors =new int[]{  
  16.             Color.rgb(54,217,169),Color.rgb(0,171,255),Color.rgb(80,195,252),Color.rgb(13,142,207),  
  17.             Color.rgb(2,211,21),Color.rgb(176,222,9),Color.rgb(248,255,1),Color.rgb(252,210,2),  
  18.             Color.rgb(255,159,13),Color.rgb(255,100,0),Color.rgb(234,14,0),  
  19.             };  
  20.     //阴影数组  
  21.     private int[] shade_colors = new int[]{  
  22.             Color.rgb(26,164,123),Color.rgb(0,154,230),Color.rgb(21,178,255),Color.rgb(5,102,153),  
  23.             Color.rgb(3,147,15),Color.rgb(124,158,8),Color.rgb(212,218,2),Color.rgb(219,183,6),  
  24.             Color.rgb(214,135,5),Color.rgb(210,90,13),Color.rgb(199,13,1),  
  25.             };  
  26.       
  27.     //区域百分比  
  28.     private int percent[];  
  29.       
  30.     private String title;  
  31.     private int thickness= 20;  
  32.     float x, y;  
  33.       
  34.     //默认可响应点击事件  
  35.     private boolean isOntouch= true;  
  36.     //下面的图例文字  
  37.     private String[] info;  
  38.       
  39.     //点击事件的计算  
  40.     private float centerX;  
  41.     private float centerY;  
  42.       
  43.     private Context context;  
  44.       
  45.     //图例文字的pain  
  46.     private Paint legendPaint;   
  47.     //饼图的paint  
  48.     private Paint mainPaint;  
  49.       
  50.     //默认显示右边  
  51.     private WHERE where  = WHERE.right;  
  52.   
  53.     public static enum WHERE{  
  54.         right ,bottmo  
  55.     }     
  56.       
  57.     /** 
  58.      * @param context   
  59.      * @param colors       最上面颜色数组 
  60.      * @param shade_colors 阴影颜色数组 
  61.      * @param percent      百分比 (和必须是360) 
  62.      */  
  63.     public PieView(Context context,int[] percent, String[] info) {  
  64.         super(context);  
  65.   
  66.         this.percent = percent;  
  67.         this.context = context;  
  68.         this.info = info;  
  69.         initPaint();  
  70.     }     
  71.   
  72.     //初始化 画笔  
  73.     private void initPaint(){  
  74.           
  75.         legendPaint = new Paint();  
  76.         legendPaint.setColor(Color.BLACK);  
  77.         legendPaint.setStrokeWidth(1f);  
  78.   
  79.         mainPaint = new Paint();  
  80.         mainPaint.setStyle(Style.FILL);  
  81.         mainPaint.setAntiAlias(true);     
  82.     }  
  83.   
  84.     //设置饼图的大小  这里已经给了默认大小了  
  85.     public void  setSize(int areaWidth ,int areaHight){   
  86.         this.areaWidth = areaWidth;  
  87.         this.areaHight = areaHight;  
  88.     }  
  89.       
  90.     //饼图的标题  
  91.     public void setTitle(String title){  
  92.         this.title = title;  
  93.     }  
  94.       
  95.     public void setWhere(WHERE s){  
  96.         this.where =  s;  
  97.     }  
  98.       
  99.     public void setThickness(int thickness) {  
  100.         this.thickness = thickness;  
  101.         areaY=thickness+2;  
  102.         this.invalidate();  
  103.     }  
  104.   
  105.   
  106.     // 主要访法   
  107.     @Override  
  108.     protected void onDraw(Canvas canvas) {  
  109.         super.onDraw(canvas);  
  110.           
  111.         //开画  
  112.         for(int i=0;i <= thickness;i++){  
  113.               
  114.             int tempAngle=0;  
  115.             for(int j=0;j< percent.length;j++){  
  116.                 //画笔的颜色  
  117.                 mainPaint.setColor(shade_colors[j]);  
  118.                 //坐标点 start end  
  119.                 RectF rectF = new RectF(areaX, areaY-i, areaX+areaWidth, areaHight-i);  
  120.                 //画弧  
  121.                 canvas.drawArc(rectF, tempAngle,percent[j], true, mainPaint);  
  122.                 tempAngle+=percent[j];    
  123.             }  
  124.               
  125.               
  126.             //开始画图例区域  
  127.             if(i  == thickness ){  
  128.                   
  129.                 RectF rectF = new RectF(areaX, areaY- thickness, areaX + areaWidth, areaHight- thickness);  
  130.                 centerX = rectF.centerX();  
  131.                 centerY = rectF.centerY();  
  132.   
  133.                 int temp = areaHight + 20/* height-320*/;                 
  134.                   
  135.                 for(int j=0;j<percent.length;j++){  
  136.                       
  137.                       
  138.                     mainPaint.setColor(colors[j]);  
  139.                     canvas.drawArc(rectF , tempAngle,percent[j], true, mainPaint);  
  140.                     tempAngle+=percent[j];  
  141.                       
  142.                       
  143.                     //说明区域  
  144.                     RectF rect = new RectF(areaX, temp, areaX+40, temp-10);//标识区域  
  145.                     canvas.drawText(info[j], areaX+60, temp, legendPaint);  
  146.                     canvas.drawRect(rect, mainPaint);  
  147.                     temp += 25;  
  148.                 }  
  149.             }  
  150.         }  
  151.           
  152.         //  
  153.         for (int i = 0; i < colors.length; i++) {  
  154.               
  155.             if (isOntouch) {  
  156.                 isOntouch = false;  
  157.                 System.out.println(centerX + ""  + centerY);  
  158.                   
  159.                 double d = Math.atan2(y-centerY, x-centerX)*180/Math.atan2(0.0, -1.0);  
  160.                   
  161.                 if (d < 0) {  
  162.                     d = 360 + d;  
  163.                 }  
  164.           
  165.                 int temp = 0;  
  166.                 for (int j = 0; j < percent.length; j++) {  
  167.                       
  168.                     Log.e(Float.toString(y), Float.toString(areaHight));  
  169.                       
  170.                     if (d >temp && d < percent[j]+temp && y < areaHight) {  
  171.                            System.out.println(" " + colors[j]);  
  172.           
  173. //                      context.startActivity(it);  
  174.                           
  175.                         Toast.makeText(context, "colors[j]="+ colors[j]  
  176.                                                 + "----x,y="+ x+","+y  
  177.                                                 +"--temp="+ temp,     
  178.                                 1000).show();  
  179.                     }  
  180.                     temp += percent[j];  
  181.                 }  
  182.             }  
  183.         }  
  184.     }  
  185.       
  186.     @Override  
  187.     public boolean onTouchEvent(MotionEvent event) {  
  188.           
  189.         if (event.getAction() == MotionEvent.ACTION_UP) {  
  190.             isOntouch = true;  
  191.             x = event.getX();  
  192.             y = event.getY();  
  193.             invalidate();  
  194.         }  
  195.         return true;  
  196.     }  
  197.       
  198.       
  199.     @Override  
  200.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  201.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  202.     }  
  203. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值