andriod饼图(3d)简单实现

饼图由于实现简单,所以试了下3d饼图,其实没什么区别,依然简单实现。

效果图:


代码奉上:

package mychart;

import android.content.Context;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.Path.Direction;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.view.View;

public class Pie3DView extends View {
	
	private int[] data;				//数据
	private String[] info;			//信息	
	private float[] percent;		//比例
	private float depth; 			//深度	   
	private int[] colors = 			//颜色
			new int[]{Color.RED, Color.YELLOW, Color.BLUE, Color.GREEN, Color.CYAN};	
	private Paint mainPaint;		//轮廓画笔
	private int ScrHeight;			//屏幕高度
	private int ScrWidth;			//屏幕宽度
	private Paint arrPaint;			//填充画笔
	private Paint textPaint = null;	//文本画笔	
	
	//构造函数
	public Pie3DView(Context context,int[] data, String[] info) {
		super(context);

		this.data = data;
		this.info = info;
		initData();
		initPaint();
	}	
	//初始化画笔
	private void initPaint(){
		mainPaint = new Paint();	
		mainPaint.setAntiAlias(true);	
		mainPaint.setColor(Color.WHITE);
		mainPaint.setStyle(Style.STROKE);
		mainPaint.setStrokeWidth(3);
		
		arrPaint = new Paint();			
		arrPaint.setStyle(Style.FILL);
		BlurMaskFilter PaintBGBlur = new BlurMaskFilter(
				2, BlurMaskFilter.Blur.SOLID);
		arrPaint.setMaskFilter(PaintBGBlur);
		
		textPaint = new Paint();
		textPaint.setColor(Color.BLUE);
		textPaint.setTextSize(16);
		textPaint.setTypeface(Typeface.DEFAULT_BOLD);
	}
	//数据转化比例
	private void initData(){
		int sum=0;
		for (int i = 0 ;i < data.length; i++){
			sum += data[i];
		}
		percent = new float[data.length];
		for (int i = 0 ;i < data.length; i++){
			percent[i] = (float)data[i] /sum * 360;
		}
	}
	//绘图
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		
		ScrHeight = getHeight();
		ScrWidth = getWidth();		
		
		float cirX = ScrWidth / 2;
		float cirY = ScrHeight / 3;
		float radius = ScrHeight / 4;
		depth = radius / 5;
		
		final float p = 0.5f; 
		float arcLeft = cirX - radius ;
		float arcTop  = cirY - radius * p;
		float arcRight = cirX + radius ;
		float arcBottom = cirY + radius * p;
		RectF arcRF0;
		 for(int j= (int)depth; j>=0; j--){
			arcRF0 = new RectF(arcLeft, arcTop+j, arcRight, arcBottom+j);
			float CurrPer = -20;
			for(int i=0; i<percent.length; i++) {
				arrPaint.setColor(colors[i]);
				canvas.drawArc(arcRF0, CurrPer, percent[i], true, arrPaint);
				if(j==1 && CurrPer>0 && CurrPer<180)
					canvas.drawLine(cirX + (float)Math.cos(CurrPer / 180 * Math.PI) * radius,
							cirY + (float)Math.sin(CurrPer / 180 * Math.PI) * radius *p,
							cirX + (float)Math.cos(CurrPer / 180 * Math.PI) * radius,
							cirY + (float)Math.sin(CurrPer / 180 * Math.PI) * radius *p + 1f + depth,
							mainPaint);		
				if(j==0 || j==depth)
					canvas.drawArc(arcRF0, CurrPer, percent[i], true, mainPaint);
				CurrPer += percent[i];
			}
		}	
		
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值