1.简单的实现效果图:

2.自定义View的实现

package myapplication.com.myapp.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View; import java.util.ArrayList; import myapplication.com.myapp.bean.ViewData; /**
* Created by Administrator on 2017/1/8.
*/
public class MyView extends View {
private int[] mColors = {
Color.BLUE, Color.DKGRAY, Color.CYAN, Color.RED, Color.GREEN
};
private Paint paint; //画笔
private ArrayList<ViewData> viewDatas; //数据集
private int w; //View宽高
private int h;
private RectF rectF; //矩形 public MyView(Context context) {
super(context);
initPaint(); //设置画笔
} //设置数据
public void setData(ArrayList<ViewData> viewDatas) {
this.viewDatas = viewDatas;
initData(); //设置数据的百分度和角度
invalidate(); //刷新UI
} public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
} public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initPaint();
} //初始化画笔
private void initPaint() {
paint = new Paint();
//设置画笔默认颜色
paint.setColor(Color.WHITE);
//设置画笔模式:填充
paint.setStyle(Paint.Style.FILL);
//
paint.setTextSize(30);
//初始化区域
rectF = new RectF();
} //确定View大小
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
this.w = w; //获取宽高
this.h = h;
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.translate(w / 2, h / 2); //将画布坐标原点移到中心位置
float currentStartAngle = 0; //起始角度
float r = (float) (Math.min(w, h) / 2); //饼状图半径(取宽高里最小的值)
rectF.set(-r, -r, r, r); //设置将要用来画扇形的矩形的轮廓
for (int i = 0; i < viewDatas.size(); i++) {
ViewData viewData = viewDatas.get(i);
paint.setColor(viewData.color);
//绘制扇形(通过绘制圆弧)
canvas.drawArc(rectF, currentStartAngle, viewData.angle, true, paint);
//绘制扇形上文字
float textAngle = currentStartAngle + viewData.angle / 2; //计算文字位置角度
paint.setColor(Color.BLACK);
float x = (float) (r / 2 * Math.cos(textAngle * Math.PI / 180)); //计算文字位置坐标
float y = (float) (r / 2 * Math.sin(textAngle * Math.PI / 180));
paint.setColor(Color.BLACK); //文字颜色
canvas.drawText(viewData.name, x, y, paint); //绘制文字 currentStartAngle += viewData.angle; //改变起始角度
}
} private void initData() {
if (null == viewDatas || viewDatas.size() == 0) {
return;
} float sumValue = 0; //数值和
for (int i = 0; i < viewDatas.size(); i++) {
ViewData viewData = viewDatas.get(i);
sumValue += viewData.value;
} for (ViewData data : viewDatas) {
float percentage = data.value / sumValue; //计算百分比
float angle = percentage * 360; //对应的角度
data.percentage = percentage;
data.angle = angle;
}
}
}

2.数据的填充

package myapplication.com.myapp.bean;

/**
* Created by Administrator on 2017/1/8.
*/
public class ViewData {
public String name; //名字
public int value; //数值 public int color; //颜色
public float percentage; //百分比
public float angle; //角度 public ViewData(int value, String name,int color) {
this.value = value;
this.name = name;
this.color=color; }
}

3.简单的画出饼图

    ArrayList<ViewData> viewdata=new ArrayList<>();
    viewdata.add(new ViewData(30,"30%",getResources().getColor(R.color.circle_a)));
viewdata.add(new ViewData(20,"20%",getResources().getColor(R.color.circle_b)));
viewdata.add(new ViewData(27,"27%",getResources().getColor(R.color.circle_c)));
viewdata.add(new ViewData(10,"10%",getResources().getColor(R.color.circle_d)));
viewdata.add(new ViewData(13,"13%",getResources().getColor(R.color.circle_e)));
myView.setData(viewdata);

最新文章

  1. SSIS 包部署 Package Store 后,在 IS 中可以执行,AGENT 执行却报错
  2. Python 配置日志
  3. HTML 事件处理
  4. [转]Efficiently Paging Through Large Amounts of Data
  5. php用fsockopen实现post提交数据并获得返回数据
  6. nyoj---t448(寻找最大数)
  7. C语言-06复杂数据类型-02字符串
  8. Spark(Hive) SQL数据类型使用详解(Python)
  9. Lua Interface基础使用
  10. MIFARE系列6《射频卡与读写器的通信》
  11. SQL Server各个版本的区别
  12. 使用WSUS离线下载补丁并安装在非联网的windows系统中(以Windows Server 2008 r2为例)
  13. iOS中的两种搜索方式UISearchDisplayController和UISearchController
  14. Hive篇---Hive使用优化
  15. 查询当前局域网下所有IP和物理网卡地址
  16. transition过渡动画
  17. Java 中的 IO 与 socket 编程 [ 复习 ]
  18. GoDaddy Linux主机支持机房的更换
  19. iOS-更新CocoaPods出现错误 提示重复文件
  20. x265探索与研究(六):main()函数

热门文章

  1. 使用postman模拟登录请求
  2. Win7系统无法记住网络访问的凭据怎么办?
  3. ubuntu16.04 国内源(网易、阿里)
  4. Linux常用命令速查
  5. Python——Day2(笔记代码)
  6. Linux下挂载分区 (本人实例)
  7. sudo详细介绍
  8. python第二周:数据类型、列表、字典
  9. 关于mvc架构的浅谈
  10. nyoj 2 括号配对问题水