public class ArcView extends View {private int mHeight, mWidth;//宽高private Paint mPaint;//扇形的画笔private Paint mTextPaint;//画文字的画笔private int centerX, centerY;//中心坐标//"其他"的value//扇形图分成太多快 所以要合并一部分为其他 即图中灰色部分private double rest;private int maxNum;//扇形图的最大块数 超过的item就合并到其他String others = "其他";//“其他”块要显示的文字double total;//数据的总和double[] datas;//数据集String[] texts;//每个数据对应的文字集//颜色 默认的颜色private int[] mColors = {Color.parseColor("#FF4081"), Color.parseColor("#ffc0cb"),Color.parseColor("#00ff00"), Color.parseColor("#0066ff"), Color.parseColor("#ffee00")};private int mTextSize;//文字大小private int radius = 1000;//半径public ArcView(Context context) {super(context);}public ArcView(Context context, AttributeSet attrs) {super(context, attrs);init();}//初始化private void init() {mPaint = new Paint();mPaint.setStrokeCap(Paint.Cap.ROUND);mPaint.setAntiAlias(true);mTextPaint = new Paint();mTextPaint.setTextSize(40);mTextPaint.setStrokeWidth(3);mTextPaint.setAntiAlias(true);mTextPaint.setColor(Color.BLACK);mTextSize = 30;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//获取宽高 不要设置wrap_contentmHeight = MeasureSpec.getSize(heightMeasureSpec);mWidth = MeasureSpec.getSize(widthMeasureSpec);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//无数据if (datas == null || datas.length == 0) return;centerX = (getRight() - getLeft()) / 2;centerY = (getBottom() - getTop()) / 2;int min = mHeight > mWidth ? mWidth : mHeight;if (radius > min / 2) {radius = (int) ((min - getPaddingTop() - getPaddingBottom()) / 3.5);}//画扇形canvas.save();drawCircle(canvas);canvas.restore();//线与文字canvas.save();drawLineAndText(canvas);canvas.restore();}//画线与文字private void drawLineAndText(Canvas canvas) {int start = 0;canvas.translate(centerX, centerY);//平移画布到中心mPaint.setStrokeWidth(4);for (int i = 0; i < (maxNum < datas.length ? maxNum : datas.length); i++) {float angles = (float) ((datas[i] * 1.0f / total) * 360);drawLine(canvas, start, angles, texts[i], mColors[i % mColors.length]);start += angles;}//画其他if (start < 359)drawLine(canvas, start, 360 - start, others, Color.GRAY);}private void drawLine(Canvas canvas, int start, float angles, String text, int color) {mPaint.setColor(color);float stopX, stopY;stopX = (float) ((radius + 40) * Math.cos((2 * start + angles) / 2 * Math.PI / 180));stopY = (float) ((radius + 40) * Math.sin((2 * start + angles) / 2 * Math.PI / 180));canvas.drawLine((float) ((radius - 20) * Math.cos((2 * start + angles) / 2 * Math.PI / 180)),(float) ((radius - 20) * Math.sin((2 * start + angles) / 2 * Math.PI / 180)),stopX, stopY, mPaint);//画横线int dx;//判断横线是画在左边还是右边int endX;if (stopX > 0) {endX = (centerX - getPaddingRight() - 20);} else {endX = (-centerX + getPaddingLeft() + 20);}//画横线canvas.drawLine(stopX, stopY,endX, stopY, mPaint);dx = (int) (endX - stopX);//测量文字大小Rect rect = new Rect();mTextPaint.getTextBounds(text, 0, text.length(), rect);int w = rect.width();int h = rect.height();int offset = 20;//文字在横线的偏移量//画文字canvas.drawText(text, 0, text.length(), dx > 0 ? stopX + offset : stopX - w - offset, stopY + h, mTextPaint);//测量百分比大小String percentage = angles / 3.60 + "";percentage = percentage.substring(0, percentage.length() > 4 ? 4 : percentage.length()) + "%";mTextPaint.getTextBounds(percentage, 0, percentage.length(), rect);w = rect.width() - 10;//画百分比canvas.drawText(percentage, 0, percentage.length(), dx > 0 ? stopX + offset : stopX - w - offset, stopY - 5, mTextPaint);}//画扇形private void drawCircle(Canvas canvas) {RectF rect = new RectF((float) (centerX - radius), centerY - radius,centerX + radius, centerY + radius);int start = 0;for (int i = 0; i < (maxNum < datas.length ? maxNum : datas.length); i++) {float angles = (float) ((datas[i] * 1.0f / total) * 360);mPaint.setColor(mColors[i % mColors.length]);canvas.drawArc(rect, start, angles, true, mPaint);start += angles;}//画"其他"rest = 0;for (int i = maxNum; i < datas.length; i++) {rest += datas[i];}float angles = (float) 360 - start;mPaint.setColor(Color.GRAY);canvas.drawArc(rect, start, angles, true, mPaint);}//setterpublic void setColors(int[] mColors) {this.mColors = mColors;invalidate();}public void setTextSize(int mTextSize) {this.mTextSize = mTextSize;mTextPaint.setTextSize(mTextSize);invalidate();}public void setRadius(int radius) {this.radius = radius;setTextSize(radius / 6);invalidate();}public void setMaxNum(int maxNum) {this.maxNum = maxNum;invalidate();}public void setOthersText(String others) {this.others = others;}public abstract class ArcViewAdapter<T> {public void setData(List<T> list) {datas = new double[list.size()];texts = new String[list.size()];for (int i = 0; i < list.size(); i++) {total += getValue(list.get(i));datas[i] = getValue(list.get(i));texts[i] = getText(list.get(i));}}//通过传来的数据集的某个元素  得到具体的数字public abstract double getValue(T t);//通过传来的数据集的某个元素  得到具体的描述public abstract String getText(T t);}}

//Activity中调用

List<Times> times = new ArrayList<>();
Times studentT = new Times();
studentT.hour = studentsSituation.getMatureStudents();//即将到期学员
studentT.text = "";Times studentT1 = new Times();
studentT1.hour = studentsSituation.getExperiencedStudents();//体验学员
studentT1.text = "";Times studentT2 = new Times();
studentT2.hour = studentsSituation.getFormalStudents();//正式学员
studentT2.text = "";times.add(studentT);
times.add(studentT1);
times.add(studentT2);getmyAdapter(times, arc1);
public void getmyAdapter(List<Times> times, ArcView mArcView) {ArcView.ArcViewAdapter myAdapter = mArcView.new ArcViewAdapter<Times>() {@Overridepublic double getValue(Times times) {return times.hour;}@Overridepublic String getText(Times times) {return times.text;}};//设置adaptermyAdapter.setData(times);//设置数据集mArcView.setMaxNum(times.size());//设置可以显示的最大数值 该数值之后的会合并为其他}
class Times {int hour;String text;
}

//布局调用

<teacher_administration.com.mvp.view.weigview.ArcView

android:id="@+id/arc2"

android:layout_width="match_parent"

android:layout_height="244dp" android:visibility="gone" />

Android 自定义扇形统计图相关推荐

  1. android动画绘制扇形,Android自定义扇形倒计时实例代码

    一.概述 严格来说,我是Android小白,写的目的只是想作为知识储备而已-.但是想到别人或许会不小心搜到我的这篇,如果我只是简单的描述,别人有可能看不懂,说不定还被吐槽,那岂不是很冤吗? 所以,我还 ...

  2. android绘制直角坐标系,Android自定义View之扇形统计图

    Android自定义View之扇形统计图 点击标题下「蓝色微信名」可快速关注 作者| Android_gen 地址 | http://www.jianshu.com/p/cc93c5dd43ad 源码 ...

  3. android自动画线,Android自定义View——扇形统计图

    Android 扇形统计图 先看看效果: 看上去如果觉得还行就继续往下看吧! 效果图1 效果图2 自定义View 定义成员变量 private int mHeight, mWidth;//宽高 pri ...

  4. Android 扇形统计图的设计与编写

    先上图,包含统计图初始化时的动画,点击环形的效果 饼状图根据效果不同,调用的APi参数略微有差异,有些同学可能不想要中间的空白直接全部展示扇形,emmmm.这种需求比你现在看到的这个样子 要简单的多, ...

  5. Android自定义View之扇形饼状图

    前言:继上次写了自定义圆形进度条后,今天给大家带来自定义扇形饼状图.先上效果图: 是不是很炫?看上去还有点立体感.下面带大家一起来瞧一瞧吧. 一.定义成员变量,重写构造方法 看着这个效果图,我们可以想 ...

  6. android自定义抽奖,Android自定义view制作抽奖转盘

    本文实例为大家分享了Android自定义view制作抽奖转盘的具体代码,供大家参考,具体内容如下 效果图 TurntableActivity package com.bawei.myapplicati ...

  7. Android自定义View之画圆环(进阶篇:圆形进度条)

    前言: 如果你想读懂或者更好的理解本篇文章关于自定义圆环或圆弧的内容.请你务必提前阅读下Android自定义View之画圆环(手把手教你如何一步步画圆环).在这篇文章中,详细描述了最基本的自定义圆环的 ...

  8. 自定义扇形进度条、异步加载网络图片、Activity疯狂旋转动画

    效果预览: 正文 1.自定义扇形进度条. 思考: (1)如何绘制扇形. (2)重写onDraw(Canvas canvas) 或 draw(Canvas canvas). (3)是否保留背景设置. ( ...

  9. Android 自定义View实现环形带刻度颜色渐变的进度条

    上次写了一篇Android 自定义View实现环形带刻度的进度条,这篇文章就简单了,只是在原来的基础上加一个颜色渐变. 按照惯例,我们先来看看效果图 一.概述 1.相比于上篇文章,这里我们的颜色渐变主 ...

最新文章

  1. Centos7 Kubernetes1.8+docker容器集群
  2. Python Split函数的用法总结
  3. CSS设置按钮式超链接
  4. CentOS6.5 gcc升级到4.8.2
  5. java实现打印购物清单jframe_在java中打印2页的jframe
  6. 【LeetCode笔记】94 144 145. 二叉树的前序、中序、后序遍历的迭代与递归(Java、dfs、迭代)
  7. 剑指云原生数据库 2.0,阿里云发布全新一站式敏捷数据仓库解决方案
  8. 【bzoj1222】[HNOI2001]产品加工 背包dp
  9. 银行家算法 计算机操作系统,计算机操作系统 银行家算法.doc
  10. c语言链表桶排序,【排序】图解桶排序
  11. 微信小程序开发入门与实践
  12. tftpd32刷路由器方法_不走弯路:小米路由器3G 刷Padavan固件简单教程
  13. 微信公众号编辑排版规范(试行版)
  14. js 排序 字符串内含数字字母特殊符号排序
  15. html5在线聊天一对一,纯js网页在线聊天对话插件(原创)
  16. SEO新手入门必读,系统学习SEO知识理念
  17. 2018云计算服务器数量,2018年全球及中国云计算行业市场规模及增速预测【图】...
  18. 动态规划 最长不下降子序列
  19. 「Activiti精品 悟纤出品」Activiti插件来助你一臂之力 - 第327篇
  20. mysql oder by 注入_Order by排序注入方法小总结

热门文章

  1. 23、网络层设计问题(网络层)
  2. 集结WAIC世界人工智能大会,“AI头雁”百度将带来哪些亮点?
  3. 名热大佬的域名投资格言:正确对待米市!正确对待域名!
  4. html单行文本垂直居中对齐,关于使用line-height单行文本的垂直居中问题
  5. 单行文本 判断是不是溢出
  6. 腾讯QQ每分钟在线人数的计算方法
  7. kindle电子书软件安装流程
  8. linux下rename命令用法详解(重命名文件)
  9. 基于LSTM模型进行置信度评估 方法研究+代码
  10. JavaScript 循环中Continue语句