饼状图

项目需求:






实现代码:


package com.example.wavedemo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.view.View;

public class BingPic2 extends View{
	private Paint paint;
	private int height;//控件的高度
	private int width;//空间的宽度
	private int w;
	private int h;
	private TextPaint textpaint;//绘制文字的画笔
	private int radius;//饼图的半径
	private RectF rectf1;

	public BingPic2(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

	public BingPic2(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public BingPic2(Context context) {
		super(context);
		init();
	}

	private void init() {
		paint=new Paint(Paint.ANTI_ALIAS_FLAG|Paint.DITHER_FLAG);
		paint.setAntiAlias(true);
		textpaint=new TextPaint(Paint.ANTI_ALIAS_FLAG|Paint.DITHER_FLAG);
		textpaint.setAntiAlias(true);
		textpaint.setColor(Color.parseColor("#123435"));
		textpaint.setTextSize(20);
		
	}
	
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		setMeasuredDimension(heightMeasureSpec, heightMeasureSpec);
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	}
	
	
	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		super.onSizeChanged(w, h, oldw, oldh);
		this.w=w;
		this.h=h;
		height=h-100;
		width=w-100;
		radius=(width-200)/2+50;
		rectf1=new RectF(100, 100, width, height);
		
	}
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		paint.setColor(Color.parseColor("#4476b6"));
		canvas.drawArc(rectf1, 0, 30, true, paint);
		canvas.save();
		canvas.translate(w/2, h/2);
		canvas.rotate(15);
		canvas.drawText("1000", radius, 0, textpaint);
		canvas.restore();
		paint.setColor(Color.parseColor("#b94542"));
		canvas.drawArc(rectf1, 31, 140, true, paint);
		canvas.save();
		canvas.translate(w/2, h/2);
		canvas.rotate(30+140/2);
		canvas.drawText("1000", radius, 0, textpaint);
		canvas.restore();
		paint.setColor(Color.parseColor("#92b44e"));
		canvas.drawArc(rectf1, 172, 70, true, paint);
		canvas.save();
		canvas.translate(w/2, h/2);
		canvas.rotate(172+70/2);
		canvas.drawText("1000", radius, 0, textpaint);
		canvas.restore();
		paint.setColor(Color.parseColor("#755999"));
		canvas.drawArc(rectf1, 243, 116, true, paint);
		canvas.save();
		canvas.translate(w/2, h/2);
		canvas.rotate(243+116/2);
		canvas.drawText("1000", radius, 0, textpaint);
		canvas.restore();
	}
	

}


效果图:

这种效果很明显 饼图文字也随着旋转了(主要利用canvas的rotate方法)。


另一只方式:


package com.example.wavedemo;

import java.util.List;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.RectF;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.view.View;
/**
 * 
 * @author huozhenpeng
 *
 */
public class BingPic extends View {
	private Paint paint;
	private int height;// 控件的高度
	private int width;// 空间的宽度
	private int w;
	private int h;
	private TextPaint textpaint;// 绘制文字的画笔
	private int radius;// 饼图的半径
	private RectF rectf1;
	private List<Integer> lists;// 存放四个角度
	private List<Integer>  datas;//存放描述数据
	public BingPic(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

	public BingPic(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public BingPic(Context context) {
		super(context);
		init();
	}

	private void init() {
		paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
		paint.setAntiAlias(true);
		textpaint = new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
		textpaint.setAntiAlias(true);
		textpaint.setColor(Color.parseColor("#123435"));
		textpaint.setTextSize(20);
		textpaint.setTextAlign(Align.CENTER);
		invalidate();

	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		setMeasuredDimension(heightMeasureSpec, heightMeasureSpec);
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		super.onSizeChanged(w, h, oldw, oldh);
		this.w = w;
		this.h = h;
		height = h - 100;
		width = w - 100;
		radius = (w - 200) / 2 + 50;
		rectf1 = new RectF(100, 100, width, height);

	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		paint.setColor(Color.parseColor("#4476b6"));
		canvas.drawArc(rectf1, 0+1, lists.get(0)-1, true, paint);
		canvas.save();
		canvas.translate(w / 2, h / 2);
		canvas.drawText(datas.get(0)+"",
				(float) (radius * Math.cos(lists.get(0) / 2 * Math.PI / 180)),
				(float) (radius * Math.sin(lists.get(0) / 2 * Math.PI / 180)),
				textpaint);
		canvas.restore();
		paint.setColor(Color.parseColor("#b94542"));
		canvas.drawArc(rectf1, lists.get(0) + 1, lists.get(1)-1, true, paint);
		canvas.save();
		canvas.translate(w / 2, h / 2);
		canvas.drawText(
				datas.get(1)+"",
				(float) (radius * Math.cos((lists.get(0) + lists.get(1) / 2)
						* Math.PI / 180)),
				(float) (radius * Math.sin((lists.get(0) + lists.get(1) / 2)
						* Math.PI / 180)), textpaint);
		canvas.restore();
		paint.setColor(Color.parseColor("#92b44e"));
		canvas.drawArc(rectf1, lists.get(0) + lists.get(1) + 1, lists.get(2)-1,
				true, paint);
		canvas.save();
		canvas.translate(w / 2, h / 2);
		canvas.drawText(
				datas.get(2)+"",
				(float) (radius * Math.cos((lists.get(0) + lists.get(1) + lists
						.get(2) / 2) * Math.PI / 180)),
				(float) (radius * Math.sin((lists.get(0) + lists.get(1) + lists
						.get(2) / 2) * Math.PI / 180)), textpaint);
		canvas.restore();
		paint.setColor(Color.parseColor("#755999"));
		canvas.drawArc(rectf1, lists.get(0) + lists.get(1) + lists.get(2) + 1,
				lists.get(3)-1, true, paint);
		canvas.save();
		canvas.translate(w / 2, h / 2);
		canvas.drawText(
				datas.get(3)+"",
				(float) (radius * Math.cos((lists.get(0) + lists.get(1)
						+ lists.get(2) + lists.get(3) / 2)
						* Math.PI / 180)),
				(float) (radius * Math.sin((lists.get(0) + lists.get(1)
						+ lists.get(2) + lists.get(3) / 2)
						* Math.PI / 180)), textpaint);
		canvas.restore();

	}

	public void setData(List<Integer> lists,List<Integer> datas) {
		if (lists.size()!= 4) {
			throw new IllegalArgumentException("参数长度应为4"); 
		}
		this.lists = lists;
		this.datas=datas;
		init();
	}

}


配置文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/com.example.wavedemo"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <com.example.wavedemo.BingPic
        android:id="@+id/bingpic"
        android:layout_width="270dp"
        android:layout_height="270dp" />

</RelativeLayout>


MainActivity类

 bingpic=(BingPic) this.findViewById(R.id.bingpic);
        List<Integer> lists=new ArrayList<Integer>();
        lists.add(30);
        lists.add(100);
        lists.add(110);
        lists.add(120);
        List<Integer> datas=new ArrayList<Integer>();
        datas.add(10000);
        datas.add(20000);
        datas.add(3000);
        datas.add(40000);
        bingpic.setData(lists,datas);
lists集合中的数据加起来应是360度。
效果图:




3.加入动画效果

代码跟上面基本差不多

package com.example.wavedemo;

import java.util.List;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.RectF;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.view.View;
/**
 * 
 * @author huozhenpeng
 *
 */
public class BingPic extends View implements Runnable{
	private Paint paint;
	private int height;// 控件的高度
	private int width;// 空间的宽度
	private int w;
	private int h;
	private TextPaint textpaint;// 绘制文字的画笔
	private int radius;// 饼图的半径
	private RectF rectf1;
	private List<Integer> lists;// 存放四个角度
	private List<Integer>  datas;//存放描述数据
	private boolean isStartAnimation;//是否启用动画
	private int delta;//如果启用动画,每次的增量值
	public BingPic(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

	public BingPic(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public BingPic(Context context) {
		super(context);
		init();
	}

	private void init() {
		paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
		paint.setAntiAlias(true);
		textpaint = new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
		textpaint.setAntiAlias(true);
		textpaint.setColor(Color.parseColor("#123435"));
		textpaint.setTextSize(20);
		textpaint.setTextAlign(Align.CENTER);
		invalidate();

	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		setMeasuredDimension(heightMeasureSpec, heightMeasureSpec);
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		super.onSizeChanged(w, h, oldw, oldh);
		this.w = w;
		this.h = h;
		height = h - 100;
		width = w - 100;
		radius = (w - 200) / 2 + 50;
		rectf1 = new RectF(100, 100, width, height);

	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		paint.setColor(Color.parseColor("#4476b6"));
		canvas.drawArc(rectf1, 0+1, isStartAnimation?(delta<=lists.get(0)-1?delta:lists.get(0)-1):lists.get(0)-1, true, paint);
		canvas.save();
		canvas.translate(w / 2, h / 2);
		canvas.drawText(datas.get(0)+"",
				(float) (radius * Math.cos(lists.get(0) / 2 * Math.PI / 180)),
				(float) (radius * Math.sin(lists.get(0) / 2 * Math.PI / 180)),
				textpaint);
		canvas.restore();
		paint.setColor(Color.parseColor("#b94542"));
		canvas.drawArc(rectf1, lists.get(0) + 1, isStartAnimation?(delta<=lists.get(1)-1?delta:lists.get(1)-1):lists.get(1)-1, true, paint);
		canvas.save();
		canvas.translate(w / 2, h / 2);
		canvas.drawText(
				datas.get(1)+"",
				(float) (radius * Math.cos((lists.get(0) + lists.get(1) / 2)
						* Math.PI / 180)),
				(float) (radius * Math.sin((lists.get(0) + lists.get(1) / 2)
						* Math.PI / 180)), textpaint);
		canvas.restore();
		paint.setColor(Color.parseColor("#92b44e"));
		canvas.drawArc(rectf1, lists.get(0) + lists.get(1) + 1, isStartAnimation?(delta<=lists.get(2)-1?delta:lists.get(2)-1):lists.get(2)-1,
				true, paint);
		canvas.save();
		canvas.translate(w / 2, h / 2);
		canvas.drawText(
				datas.get(2)+"",
				(float) (radius * Math.cos((lists.get(0) + lists.get(1) + lists
						.get(2) / 2) * Math.PI / 180)),
				(float) (radius * Math.sin((lists.get(0) + lists.get(1) + lists
						.get(2) / 2) * Math.PI / 180)), textpaint);
		canvas.restore();
		paint.setColor(Color.parseColor("#755999"));
		canvas.drawArc(rectf1, lists.get(0) + lists.get(1) + lists.get(2) + 1,
				isStartAnimation?(delta<=lists.get(3)-1?delta:lists.get(3)-1):lists.get(3)-1, true, paint);
		canvas.save();
		canvas.translate(w / 2, h / 2);
		canvas.drawText(
				datas.get(3)+"",
				(float) (radius * Math.cos((lists.get(0) + lists.get(1)
						+ lists.get(2) + lists.get(3) / 2)
						* Math.PI / 180)),
				(float) (radius * Math.sin((lists.get(0) + lists.get(1)
						+ lists.get(2) + lists.get(3) / 2)
						* Math.PI / 180)), textpaint);
		canvas.restore();

	}

	public void setData(List<Integer> lists,List<Integer> datas) {
		if (lists.size()!= 4) {
			throw new IllegalArgumentException("参数长度应为4"); 
		}
		this.lists = lists;
		this.datas=datas;
		init();
	}

	@Override
	public void run() {
		while(true)
		{
			delta+=1;
			try {
				Thread.sleep(30);
				postInvalidate();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	/**
	 * 是否有动画
	 * @param isAnimation
	 */
	public void setAnication(boolean isAnimation)
	{
		this.isStartAnimation=isAnimation;
		init();
	}
	
	

}

 bingpic=(BingPic) this.findViewById(R.id.bingpic);
        List<Integer> lists=new ArrayList<Integer>();
        lists.add(30);
        lists.add(100);
        lists.add(110);
        lists.add(120);
        List<Integer> datas=new ArrayList<Integer>();
        datas.add(10000);
        datas.add(20000);
        datas.add(3000);
        datas.add(40000);
        bingpic.setData(lists,datas);
        bingpic.setAnication(true);
        new Thread(bingpic).start();

如果需要设置动画

 bingpic.setAnication(true);
 new Thread(bingpic).start();
不需要动画的话,不需要写这两条代码。





评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值