1. 程式人生 > >Android Canvas練習(9)自已繪分割突出效果的餅圖(Pie Chart)

Android Canvas練習(9)自已繪分割突出效果的餅圖(Pie Chart)

   這裡畫了個餅圖的變種,具有分割突出效果的餅圖(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)

MAIL: [email protected]

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

相關推薦

Android Canvas練習(9)自已分割突出效果(Pie Chart)

   這裡畫了個餅圖的變種,具有分割突出效果的餅圖(Pie Chart),就是個切蛋糕效果的餅圖,畫這種圖,其技巧就在於圓心的偏移。 在圓心偏移,半徑不變的基礎上,效果就出來了。     上圖:               怎麼樣,效果還是有模有樣的吧。      程式碼很

Android Canvas練習(2)自已(Pie Chart)

    上文弄了個繪製報表的,有了報表,當然想一併也繪個餅圖,柱形圖之類的玩玩,看看了API,覺得應當很簡單,餅圖實現了下, 實現程式碼確實也很簡單,Android的這些函式封裝的確實好用。    效果圖如下:               不過實現過程還是比較曲折的,首

Android Canvas練習(6)(Pie Chart)百分比標註位置計算技巧

     今天終於解決了困擾整整一週的,一個令人抓狂的HPUX程式碼問題。可以在這半夜神清氣爽的說下昨天晚上推匯出來的一個小技巧, 如何在一張餅圖(Pie Chart)上每個扇形的中心位置標記出百分比。 我之前寫了一篇怎麼自繪餅圖的文章,但百分比都是另外在一個 地方顯示的,

Android Canvas練習(7)繪製歐冠八強防守&控制率資料對比

    在網易資料酷的<<足壇"斧頭幫"!瘋狂馬競打爆巴薩>>中看到一幅圖,非常有特色,因為最近用Canvas繪了不少圖表,就想用程式碼把這幅圖也繪出來。 基本也繪出來了,效果圖如下:           繪製這張圖,api用得到不多,但恰好把我前面

DWR(AJAX)+Highcharts制曲線圖,

logging 數據類型 hid 一個 ext js xml 通過 for 源代碼下載 基本需求: 1. 在前臺會用DWR框架(或者AJAX)調用Java後臺代碼獲取要在Hightcharts展示的數據 2. 了解JSON(JavaScript

python 出分類效果步驟

red com plt 輸入參數 src 查看 min mage 生成 先亮結果圖:(忽略中文顯示功能,請查看以前文章進行修改) cm_light = mpl.colors.ListedColormap([‘g‘, ‘r‘, ‘b‘]) 目的: 生成分類器模型的界

Android canvas制柱形統計

ext.get hit 選擇 etc new 工廠模式 imp 設計模式 layout 如今非常多應用都須要一些統計圖。眼下第三方的統計圖也有非常多。可是在自己看來僅僅要不是特別耽誤時間還是選擇用canvas自己繪制比較合理。依賴於第三方的繪制在需求上也

關於Android制作.9.png圖片

後綴名 -s 文字 path 使用 iss eas eight 關於 第一個問題,.9格式的圖片與我們之前的一般圖片有什麽問題呢? 這是安卓開發裏面的一種特殊的圖片。這樣的格式的圖片在android 環境下具有自適應調節大小的能力。 (1)同意開發者定義可擴展區

遞歸--練習9--noi8758 2的冪次方表示

efi fine -a ret problem 來源 n! cnblogs color 遞歸--練習9--noi8758 2的冪次方表示 一、心得 找準子問題就好 二、題目 8758:2的冪次方表示 總時間限制: 1000ms 內存限制: 65536kB描述 任何一個

android非硬件加速制簡單流程

left surface fff asa face cpp erp erer enter 這裏的硬件加速是指openGL + GPU 如果不適用硬件加速: 1 ViewRootImpl.java draw:if (!dirty.isEmpty() || mIsAnima

【社交分享SDK】ShareSDK for Android 2.5.9已經公布

地址 nload trac p s unity3 share 2.x con clas ShareSDK for Android 2.5.9已經公布 版本號:V2.5.9 2015-3-19 1、升級Dropbox對API接口的調用。包含授權、

Android 學習筆記--9妹圖片+代碼混淆+打包

文件名 打包 andro span apk 使用 背景透明 學習筆記 tro 一、Android Studio 創建.9文件 註:找一張背景透明的png圖片,將文件名改成 " xxxx.9.png " 然後放到drawable文件中,雙擊 註:有一種

Android仿華為天氣制刻度盤

near 使用 list cal 有助於 sch and bre 們的 效果圖 能夠看到這個自己定義控件結合了顏色漸變、動態繪制刻度、動態水球效果。接下來我們就來看看這個效果是怎樣一步一步實現的。 開始自己定義控件 和非常多自己定義控件方式

條件、循環、函數定義、字符串操作練習9-14

cnblogs print input star 白雲 set form format for 用循環畫五角星 >>> import turtle >>> for i in range(5): turtle.forward(100)

練習9(第九章習題)

als 設置 rgs 調試 test ack col on() sim package cn.ch.w; public class TestSimpleCircle { private double radius; // 構造方法,有參構造 p

關於Android Studio中點9的編譯錯誤問題

mbo 但是 留言 清晰 文件中 pan 不能 use 計算 Android中的點9圖想必大家都非常熟悉了,能夠指定背景圖片的縮放區域和文本內容的顯示區域,常見如QQ聊天界面的背景氣泡這種文本內容不固定並需要適配的應用場景。 這裏也給大家準備了一張圖,詳細介紹了一下“A

Canvas制股票K線

mat restore screen 位置 mar toc rect() store water 最近想在小程序做股票K線圖,於是嘗試用Canvas實現股票K線圖。K線圖用到Canvas的API其實只有劃線和畫矩形,即moveTo(),lineTo(),fillRect()

【轉】Android性能優化-過度制解決方案

裏的 watermark == ++ 深度 getc 像素 多次 但是 轉載請註明出處:http://blog.csdn.net/a740169405/article/details/53896497 過度繪制: 屏幕上某一像素點在一幀中被重復繪制多次,就是過度繪制。

基礎練習-9.特殊回文數

編程 十進制 std amp data nbsp c++ a* tdi 問題描述   123321是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的。  輸入一個正整數n, 編程求所有這樣的五位和六位十進制數,滿足各位數字之和等於n 。 輸入格式   輸入一行,包含一個正整數

第二階段:1.流程圖:9.excel制甘特

嚴格 http 十字架 mage 表示 流程圖 圖片 bubuko 狀況 後面的框都是日期 可以以一個月為周期計算或者周或者... 因為產品經理應該嚴格把控產品的時間 因此甘特圖特別有必要 註意:任務拆解的越細 把控度越強 然後對格式進行設置 註意時間下面可以