先来一张效果图预览

代码其实很简单,鄙人处于研究阶段,有更好的建议欢迎指出。

实现自定义view第一步继承view类,

然后画图的渲染顺序为先执行onMesure方法计算view的宽高,这里把整个view处理成一个正方形,其它图形的有待研究

先把全局变量设置出来,以便不影响思维顺序

private int viewWidth = 0;private int viewHeight = 0;private float contentPadding = 0f;//默认边距private float defaultPadding = 5f;private float colorCircleWidth = 30f;//默认弧形宽度float startRadian = 180;//起始角度水平左边开始private int backGroundColor = 0;List<List<CircleBean>> circleNumList;
@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {Log.e("onMeasure", "onMeasure");super.onMeasure(widthMeasureSpec, heightMeasureSpec);viewWidth = getWidth();viewHeight = getHeight();int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);// 在wrap_content的情况下默认长度为200dpint minSize = 0;if (widthSpecSize > heightSpecSize) {minSize = heightSpecSize;} else if (widthSpecSize < heightSpecSize) {minSize = widthSpecSize;}// wrap_content的specMode是AT_MOST模式,这种情况下宽/高等同于specSize// 查表得这种情况下specSize等同于parentSize,也就是父容器当前剩余的大小// 在wrap_content的情况下如果特殊处理,效果等同martch_parentif (widthSpecMode == MeasureSpec.AT_MOST && heightSpecMode == MeasureSpec.AT_MOST) {setMeasuredDimension(minSize, minSize);viewWidth = viewHeight = minSize;} else if (widthSpecMode == MeasureSpec.AT_MOST) {setMeasuredDimension(minSize, heightSpecSize);viewWidth = minSize;viewHeight = heightSpecSize;} else if (heightSpecMode == MeasureSpec.AT_MOST) {setMeasuredDimension(widthSpecSize, minSize);viewWidth = widthSpecSize;viewHeight = minSize;}}

viewWidth和viewHeight为一个全局的变量,用于设置绘图的背景

计算完view宽高后执行onDraw方法进行渲染我们想要的图形样式

@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Log.e("onDraw", "onDraw");//设置背景颜色Paint bgPaint = new Paint();bgPaint.setColor(backGroundColor);canvas.drawRect(0, 0, viewWidth, viewHeight, bgPaint);Paint mArcPaint = new Paint();mArcPaint.setAntiAlias(true);mArcPaint.setColor(Color.parseColor("#ff6600"));mArcPaint.setStyle(Paint.Style.STROKE);mArcPaint.setStrokeWidth(colorCircleWidth);//线宽drawableCircle(canvas, mArcPaint, circleNumList);}
private void drawableCircle(Canvas canvas, Paint circlePaint, List<List<CircleBean>> circleNumList) {if (defaultPadding * circleNumList.size() > (viewWidth / 2 - defaultPadding)) {colorCircleWidth = (viewWidth / 2 - defaultPadding) / circleNumList.size();}float circleWidth = defaultPadding;for (int j = 0; j < circleNumList.size(); j++) {RectF mRectF = new RectF(circleWidth, circleWidth, viewWidth - circleWidth, viewHeight - circleWidth);List<CircleBean> circleBeanList = circleNumList.get(j);startRadian = 180;float scalRadian = 0;for (int i = 0; i < circleBeanList.size(); i++) {CircleBean circleBean = circleBeanList.get(i);scalRadian = circleBean.getRadianValue();String color = circleBean.getRadianColor();circlePaint.setColor(Color.parseColor(color));if ((startRadian + scalRadian) >= (360 + 180)) {//弧度总和超过一圈在起始点结束scalRadian = ((360 + 180) - startRadian);}canvas.drawArc(mRectF, startRadian, scalRadian, false, circlePaint);startRadian += circleBean.getRadianValue();}circleWidth += colorCircleWidth + 1;}}

此处图表的数据为一个重叠的数据,每一层数据可以绘画一个圆,bean里面可以设置每一段弧度范围和颜色。

(备注)当一层圆的数据超过360弧度时只 会显示一个圆的范围,超出360度的值不显示

bean里面有两个参数可供使用

public class CircleBean {private float radianValue;//每段弧度的值private String radianColor;//每段弧度的颜色public float getRadianValue() {return radianValue;}public void setRadianValue(float radianValue) {this.radianValue = radianValue;}public String getRadianColor() {return radianColor == null ? "" : radianColor;}public void setRadianColor(String radianColor) {this.radianColor = radianColor;}
}

当然还少不了自定义属性,在xml中可以直接设置圆圈的宽度,圆边距和整个view的背景颜色

<resources><declare-styleable name="circle_view_styleable" ><attr name="viewPadding" format="dimension"/><attr name="circleWidth" format="dimension"/><attr name="backGroundColor" format="color" /></declare-styleable>
</resources>
public CircleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);TypedArray custorm = context.obtainStyledAttributes(attrs, R.styleable.circle_view_styleable);contentPadding = custorm.getDimension(R.styleable.circle_view_styleable_viewPadding, 0f);colorCircleWidth = custorm.getDimension(R.styleable.circle_view_styleable_circleWidth, 30f);backGroundColor = custorm.getColor(R.styleable.circle_view_styleable_backGroundColor, Color.parseColor("#ffffff"));defaultPadding = colorCircleWidth / 2 + contentPadding;custorm.recycle();}

做完项目剩余时间来写的,如果 不是很完整可以下载工程来看。(工程采用as工具编写)

项目免费下载地址点击打开链接

android圆饼图占比相关推荐

  1. Android自定义睡眠下表统计图,Android 进阶自定义View(5)图表统计PieChartView圆饼图的实现...

    今天讲图表统计中比较常用的一个,像支付宝的月账单啥的,都是用圆饼图来做数据统计的,先看一下我最终实现的效果图: image.png 该效果实际上是两个实心圆叠加后的效果. image.png imag ...

  2. echarts的圆饼图自定义颜色

    圆饼图自定义颜色 1.在HTML中的代码: <div id="echartZB" style="width:400px;height:600px;margin-le ...

  3. 在DataGridView控件中一次显示出多个圆饼图的原始程序代码

    之前我们曾经提到过,您可以在Windows Form窗体上的一个DataGridView控件中一次显示出多个圆饼图(或其它形式的统计图表)以便能够一次检视多个群组数据的比例情况(如图表1所示).当时并 ...

  4. canvas画条形图 微信小程序_小程序-引入 echart 图表画圆饼图

    前言 在 web 中引入echart可视化图表是很常见的操作,那在小程序当中又如何引入使用呢 示例效果 完整示例效果-可以点击此处查看 下载使用 ec-canvas 在github上下载echarts ...

  5. android 版本分布 最新,安卓手机系统版本分布:Android 9.0占比达34%!

    原标题:安卓手机系统版本分布:Android 9.0占比达34%! 如今,就国内智能手机市场来说,华为.小米.OPPO.vivo等智能手机厂商不仅在硬件配置上激烈较量,比如采用最新的处理器,再比如手机 ...

  6. Echarts之圆饼图用法

    Echarts之圆饼图用法 css代码 html代码 js代码 css代码 #chartone {float: left;margin-left: -50px;height: 159px;width: ...

  7. C# 控件Chart的 圆饼图百分比

    开发环境: 基于 VS2019 基于C#语言 解决问题 用C# 控件Chart 画出 圆饼图百分比,很直观 结果展示 4.源代码下载地址: https://download.csdn.net/down ...

  8. pyecharts常见柱状图、圆饼图、散点图

    今天带大家认识一下pyecharts中常用的三种视图的画法.更多的是认识一下基本的配置项,避免走太多的坑.当然都是些常用的配置项,如果有奇怪的需求,大家自行查找.. 当然前提是必须先安装了pyecha ...

  9. Android 如何画圆饼图来表示智能机的市场份额

    先让大家看一下效果图: 智能机的份额可能不太准确,仅仅是举例说明一下: 定制的View代码如下: /**  *饼状图  *  * @author caicai  *  */ @SuppressLint ...

  10. Android PieChart 饼图控件

    今天写一个饼图自定义View的文章.由于公司的项目需要用到饼图,UI给的设计图和自己找的一个饼图框架的标题位置不符,所以就自己画了一个. 1,使用预览 PieChart mChart mChart = ...

最新文章

  1. SQL的多种JOIN
  2. Win2003的DHCP服务器无法提供服务怎么办?
  3. php读取js验证码,js实现获取短信验证码实例
  4. 网络模块优化方案(1)——封装网络框架
  5. (二)Mysql 基础了解,修改字符集,配置文件
  6. java 并发模型总类_java并发编程系列-内存模型基础
  7. python有必要看数据结构_盘点 Python 10 大常用数据结构(上篇)
  8. Python—开始编程
  9. 【Java】数据库编程
  10. PLSQL 的简单命令之三
  11. 分布式存储系统学习笔记(一)—什么是分布式系统(2)—数据分布
  12. 循环神经网络-Recurrent Neural Networks
  13. 【企业架构】2022年TOGAF认证是否仍然值得
  14. 小规模免税新政,账务怎么做?
  15. Bex5登陆端口异常
  16. 手机打开php格式的文件,手机上打开php格式文件|如何打开php文件?
  17. SpringBoot静态资源处理(九)
  18. 基于Python的A-Priori算法发现购物篮关联规则
  19. 为啥中国移动免费宽带突然不香了, 背后的猫腻,你知道吗?
  20. rabbitmq java 重连_RabbitMQ Java客户端自动重新连接

热门文章

  1. 立潮头 筑根基 赢未来——ZDNS合作伙伴大会成功举办
  2. php 死链查询,seo网站死链解决方法 死链查询检测工具
  3. Protel 99 SE库文件添加时“file is not recognized”
  4. java打印模板_怎样做一个word模板,用java调用打印功能
  5. 详解SSTI模板注入
  6. Saleh-Valenzuela 毫米波信道模型
  7. 巨头卡位新房赛道,与贝壳、易居相比,房多多的底牌是什么?
  8. windowsGHO镜像系统winXPwin7win8win10下载
  9. 半正定矩阵的对角元素不小于该矩阵的最小特征值
  10. STM32入门开发: 介绍SPI总线、读写W25Q64(FLASH)(硬件+模拟时序)