Android饼图的简单实现
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饼图的简单实现的更多相关文章
- Android:PopupWindow简单弹窗改进版
Android:PopupWindow简单弹窗 继续上一节的内容,改进一下,目标是点击菜单后把菜单收缩回去并且切换内容,我使用的是PopupWindow+RadioGroup public class ...
- Android.mk文件简单分析
Android.mk文件简单分析 一个Android.mk文件用来向编译系统描写叙述须要编译的源码.详细来说:该文件是GNUMakefile的一小部分.会被编译系统解析一次或多次. 能够在每个Andr ...
- IDA 调试 Android 方法及简单的脱壳实现
IDA 调试 Android 方法及简单的脱壳实现 标签: android原创逆向调试dalvik 2016-05-24 14:24 9286人阅读 评论(3) 收藏 举报 分类: 原创(25) An ...
- android EventBus的简单使用
今天,简单讲讲Android里关于EventBus的使用. 这几天,由于面试的缘故,我听到了很多Android的流行框架,但是之前自己在公司做APP时并没有使用,所以没有了解.于是在网上查找了资料,学 ...
- Android 百度地图 简单实现--- 美食搜索
Android 百度地图 简单实现--- 美食 依赖包: 加入 Android 百度依赖包: 1 key: <!-- 开发人员 key --> <meta-dat ...
- [Android]RecyclerView的简单演示样例
去年google的IO上就展示了一个新的ListView.它就是RecyclerView. 下面是官方的说明,我英语能力有限,只是我大概这么理解:RecyclerView会比ListView更具有拓展 ...
- Android RecyclerView 的简单使用
Android L SDK发布的,新API中最有意思的就是RecyclerView (后面为RV) 和 CardView了, 按照官方的说法, RV 是一个ListView 的一个更高级更灵活的一个版 ...
- 让你Android开发更简单
转载:http://www.jianshu.com/p/22ff8b5fdadc 搭建一个新的Android项目,你会怎么做? 每个人对应用框架的理解不相同,但是最终达到的效果应该是一样: ①降低项目 ...
- Android -- OkHttp的简单使用和封装
1,昨天把okHttp仔细的看了一下,以前都是调用同事封装好了的网络框架,直接使用很容易,但自己封装却不是那么简单,还好,今天就来自我救赎一把,就和大家写写从最基础的OKHttp的简单get.post ...
随机推荐
- 从ReadImage到ML- 一个不错的博客
实在对不起原作者,为了不把文章淹没在 转载的海洋里.... 原文链接: http://www.cnblogs.com/tornadomeet/archive/2012/09/26/270404 ...
- Java中数组的反转
public class ArrayDemo2 { public static void main(String[] args) { //定义一个数组存放元素 int[] arr3 = {10, 20 ...
- python tips: for循环的小问题
在python中,用for对列表进行遍历的时候,迭代器中维护的是列表的索引而不是列表的元素.也就是说,for循环是对索引进行迭代,如果在for循环过程中修改了列表,迭代出来的值是新列表的索引位置,如果 ...
- 转载:rem的用法
本文属于转载,为尊重原作者的劳动成果,在此标注原文地址,点击此处浏览. 1.rem(font size of the root element)是指相对于根元素的字体大小的单位,em(font siz ...
- css3媒介查询使用规则小结
响应式布局可以为不同终端的用户提供更加舒适的界面和更好的用户体验,而且随着目前大屏幕移动设备的普及,用大势所趋来形容也不为过. 用一句话来说:使用同一套Html代码来适配不同设备和满足不同场景不同用户 ...
- BZOJ 1123: [POI2008]BLO 求割点_乘法原理_计数
Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n&l ...
- Centos7安装keepalived(自定义路径安装)-高级篇
0.Keepalived介绍 Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat.corosync.pacemaker.但 ...
- Project Euler 44 Sub-string divisibility( 二分 )
题意:五边形数由公式Pn=n(3n−1)/2生成,在所有和差均为五边形数的五边形数对Pj和Pk中,找出使D = |Pk − Pj|最小的一对:此时D的值是多少? 思路:二分找和差 /********* ...
- BZOJ 3878 [AHOI&JSOI2014]奇怪的计算器 (线段树)
题面:BZOJ传送门 洛谷传送门 线段树好题 题目保证$a$一定是正整数,容易发现计算结果是单调的 我们把询问离线,并按照从小到大排序 某次操作可能导致某些位置达到边界$L/R$ 根据单调性的结论 这 ...
- BZOJ 2716/2648 SJY摆棋子 (三维偏序CDQ+树状数组)
题目大意: 洛谷传送门 这明明是一道KD-Tree,CDQ分治是TLE的做法 化简式子,$|x1-x2|-|y1-y2|=(x1+y1)-(x2+y2)$ 而$CDQ$分治只能解决$x1 \leq x ...