Android Canvas练习(9)自已绘分割突出效果的饼图(Pie Chart)



http://blog.csdn.net/xcl168/article/details/23591181

http://blog.csdn.net/xcl168/article/details/23591181

http://blog.csdn.net/xcl168/article/details/23591181

http://blog.csdn.net/xcl168/article/details/23591181






Android Canvas练习(9)自已绘分割突出效果的饼图(Pie Chart)

分类: Android   746人阅读  评论(2)  收藏  举报

   这里画了个饼图的变种,具有分割突出效果的饼图(Pie Chart),就是个切蛋糕效果的饼图,画这种图,其技巧就在于圆心的偏移。

在圆心偏移,半径不变的基础上,效果就出来了。

    上图:

        

     怎么样,效果还是有模有样的吧。

     代码很简单,附上:

      

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.xcl.chart;  
  2.   
  3.   
  4. /** 
  5.  * Canvas练习  
  6.  *    自已绘分割突出效果的饼图(Pie Chart) 
  7.  *      
  8.  * author:xiongchuanliang 
  9.  * date:2014-4-12 
  10.  */  
  11.   
  12. import android.content.Context;  
  13. import android.graphics.Canvas;  
  14. import android.graphics.Color;  
  15. import android.graphics.Paint;  
  16. import android.graphics.RectF;  
  17. import android.util.DisplayMetrics;  
  18. import android.view.View;  
  19.   
  20. public class PanelPieChart2 extends View{  
  21.       
  22.     private int ScrWidth,ScrHeight;   
  23.       
  24.      //演示用的百分比例,实际使用中,即为外部传入的比例参数    
  25.     private final float arrPer[] = new float[]{20f,30f,10f,40f};    
  26.     //RGB颜色数组  
  27.     private final int arrColorRgb[][] = { {778397},    
  28.                                           {148159181},    
  29.                                           {25318090},  
  30.                                           {52194188}} ;  
  31.      //指定突出哪个块  
  32.     private final int offsetBlock = 2;  
  33.       
  34. public PanelPieChart2(Context context) {  
  35.         super(context);  
  36.         // TODO Auto-generated constructor stub  
  37.           
  38.         //屏幕信息  
  39.         DisplayMetrics dm = getResources().getDisplayMetrics();  
  40.         ScrHeight = dm.heightPixels;  
  41.         ScrWidth = dm.widthPixels;  
  42.     }  
  43.   
  44.       
  45.     public void onDraw(Canvas canvas){  
  46.         //画布背景  
  47.         canvas.drawColor(Color.WHITE);                  
  48.             
  49.         float cirX = ScrWidth / 2;    
  50.         float cirY = ScrHeight / 3 ;    
  51.         float radius = ScrHeight / 5 ;//150;    
  52.                                     
  53.         float arcLeft = cirX - radius;    
  54.         float arcTop  = cirY - radius ;    
  55.         float arcRight = cirX + radius ;    
  56.         float arcBottom = cirY + radius ;    
  57.         RectF arcRF0 = new RectF(arcLeft ,arcTop,arcRight,arcBottom);     
  58.           
  59.         //画笔初始化  
  60.         Paint PaintArc = new Paint();         
  61.         Paint PaintLabel = new Paint();    
  62.         PaintLabel.setColor(Color.WHITE);  
  63.         PaintLabel.setTextSize(16);            
  64.                   
  65.         //位置计算类    
  66.         XChartCalc xcalc = new XChartCalc();      
  67.           
  68.         float Percentage = 0.0f;  
  69.         float CurrPer = 0.0f;  
  70.         int i= 0;    
  71.         for(i=0; i<arrPer.length; i++)     
  72.         {    
  73.             //将百分比转换为饼图显示角度    
  74.             Percentage = 360 * (arrPer[i]/ 100);    
  75.             Percentage = (float)(Math.round(Percentage *100))/100;    
  76.             //分配颜色              
  77.             PaintArc.setARGB(255,arrColorRgb[i][0], arrColorRgb[i][1], arrColorRgb[i][2]);  
  78.                  
  79.               
  80.             if( i == offsetBlock) //指定突出哪个块  
  81.             {  
  82.                 //偏移圆心点位置  
  83.                 float newRadius = radius /10;  
  84.                  //计算百分比标签  
  85.                 xcalc.CalcArcEndPointXY(cirX, cirY, newRadius , CurrPer + Percentage/2);      
  86.                   
  87.                 arcLeft = xcalc.getPosX() - radius;    
  88.                 arcTop  = xcalc.getPosY() - radius ;    
  89.                 arcRight = xcalc.getPosX() + radius ;    
  90.                 arcBottom = xcalc.getPosY() + radius ;    
  91.                 RectF arcRF1 = new RectF(arcLeft ,arcTop,arcRight,arcBottom);     
  92.                   
  93.               //在饼图中显示所占比例    
  94.                 canvas.drawArc(arcRF1, CurrPer, Percentage, true, PaintArc);       
  95.                   
  96.                 //计算百分比标签  
  97.                 xcalc.CalcArcEndPointXY(xcalc.getPosX(), xcalc.getPosY(), radius - radius/2/2, CurrPer + Percentage/2);       
  98.                 //标识  
  99.                 canvas.drawText(Float.toString(arrPer[i])+"%",xcalc.getPosX(), xcalc.getPosY() ,PaintLabel);      
  100.                   
  101.                   
  102.             }else{  
  103.                 //在饼图中显示所占比例    
  104.                 canvas.drawArc(arcRF0, CurrPer, Percentage, true, PaintArc);                   
  105.                 //计算百分比标签  
  106.                 xcalc.CalcArcEndPointXY(cirX, cirY, radius - radius/2/2, CurrPer + Percentage/2);     
  107.                 //标识  
  108.                 canvas.drawText(Float.toString(arrPer[i])+"%",xcalc.getPosX(), xcalc.getPosY() ,PaintLabel);          
  109.               
  110.             }  
  111.               
  112.             //下次的起始角度    
  113.             CurrPer += Percentage;    
  114.         }    
  115.             
  116.     }  
  117.   
  118. }  
   代码中只需注意下,指定要突出哪块,就在哪块上指定下偏移即可。


附上我其它绘制的图链接:

   

    Android Canvas练习(1)画一张报表来玩   

    Android Canvas练习(2)自已绘饼图

    Android Canvas练习(3)自已绘柱形图

    Android Canvas练习(4)自已绘折线图

     Android Canvas练习(5)自已绘面积图(Area Chart)

    Android Canvas练习(7)绘制欧冠八强防守&控制率数据对比图 

    Android Canvas练习(8)自已绘环形图(Dount Chart)


MAIL: xcl_168@aliyun.com

BLOG: http://blog.csdn.net/xcl168


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值