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);

Android饼图的简单实现的更多相关文章

  1. Android:PopupWindow简单弹窗改进版

    Android:PopupWindow简单弹窗 继续上一节的内容,改进一下,目标是点击菜单后把菜单收缩回去并且切换内容,我使用的是PopupWindow+RadioGroup public class ...

  2. Android.mk文件简单分析

    Android.mk文件简单分析 一个Android.mk文件用来向编译系统描写叙述须要编译的源码.详细来说:该文件是GNUMakefile的一小部分.会被编译系统解析一次或多次. 能够在每个Andr ...

  3. IDA 调试 Android 方法及简单的脱壳实现

    IDA 调试 Android 方法及简单的脱壳实现 标签: android原创逆向调试dalvik 2016-05-24 14:24 9286人阅读 评论(3) 收藏 举报 分类: 原创(25) An ...

  4. android EventBus的简单使用

    今天,简单讲讲Android里关于EventBus的使用. 这几天,由于面试的缘故,我听到了很多Android的流行框架,但是之前自己在公司做APP时并没有使用,所以没有了解.于是在网上查找了资料,学 ...

  5. Android 百度地图 简单实现--- 美食搜索

    Android 百度地图 简单实现---  美食 依赖包: 加入 Android 百度依赖包: 1  key:  <!--        开发人员 key --> <meta-dat ...

  6. [Android]RecyclerView的简单演示样例

    去年google的IO上就展示了一个新的ListView.它就是RecyclerView. 下面是官方的说明,我英语能力有限,只是我大概这么理解:RecyclerView会比ListView更具有拓展 ...

  7. Android RecyclerView 的简单使用

    Android L SDK发布的,新API中最有意思的就是RecyclerView (后面为RV) 和 CardView了, 按照官方的说法, RV 是一个ListView 的一个更高级更灵活的一个版 ...

  8. 让你Android开发更简单

    转载:http://www.jianshu.com/p/22ff8b5fdadc 搭建一个新的Android项目,你会怎么做? 每个人对应用框架的理解不相同,但是最终达到的效果应该是一样: ①降低项目 ...

  9. Android -- OkHttp的简单使用和封装

    1,昨天把okHttp仔细的看了一下,以前都是调用同事封装好了的网络框架,直接使用很容易,但自己封装却不是那么简单,还好,今天就来自我救赎一把,就和大家写写从最基础的OKHttp的简单get.post ...

随机推荐

  1. 应用五:Vue之ElementUI 表格Table与分页Pagination组件化

    (注:本文适用于有一定Vue基础或开发经验的读者,文章就知识点的讲解不一定全面,但却是开发过程中很实用的) 在平时的web项目开发过程中,列表分页查询展示应用的很频繁,为了便于阅读并减少代码的冗余,所 ...

  2. Jquery插件:提示框

    在实际项目中,很容易有这种需求:当某个操作成功或失败,需要给用户一个提示.当然最简单的做法是调用alert()方法弹窗.但alert()属于JavaScript中BOM部分,每个浏览器的样式不太一样, ...

  3. 04 Django-ORM多表操作(进阶)

      一.创建模型 下面我们通过图书管理系统,来设计出每张表之间的对应关系. 通过上图关系,来定义一下我们的模型类. from django.db import models class Book(mo ...

  4. sass揭秘之@if,@for,@each(转载)

    因为文章内含有很多sass代码,如需自己动手查看编译结果,推荐使用sassmeister这款在线编译工具,方便你阅读学习. 经过上两篇揭秘,大家心里对sass应该有了很好的认知感了,这篇文章基于前面两 ...

  5. A*寻路算法详解

    以我个人的理解: A*寻路算法是一种启发式算法,算法的核心是三个变量f,g,h的计算.g表示 从起点 沿正在搜索的路径 到 当前点的距离,h表示从当前点到终点的距离,而f=g+h,所以f越小,则经过当 ...

  6. tensorflow常见函数

    1.类型转换 tf.string_to_number(string_tensor,out_type=None,name=None)  #字符串转为数字 tf.to_double(x,name='ToD ...

  7. redis RDB快照和AOF日志持久化配置

    Redis持久化配置 Redis的持久化有2种方式   1快照  2是日志 Rdb快照的配置选项: save 900 1      // 900内,有1条写入,则产生快照 save 300 1000 ...

  8. distpicker 省市县级联

    一.前言:想着每次写项目都要遇到省市县级联,就想找一个比较简单好用的插件来...感觉挺不错~~~ 二.例子: html : 效果: 还有很多种用法,我这里只放一种,插件文件里index.html有介绍 ...

  9. UGUI实现打字的效果

    创建打字特效控制的脚本,将该脚本挂载都含有Text组件的对象上面,通过该脚本控制Text文本框的文字,以打字的效果显示文字. 脚本 using UnityEngine; using System.Co ...

  10. python指定日期后加几天判断

    #!/usr/bin/python import datetime import sys arg1_list=list(sys.argv[1].split(',')) arg2_list=list(s ...