自定义View饼状图的绘制
package com.loaderman.customviewdemo; 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.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List; /**
* Created by MQ on 2016/12/15.
*/ public class CakeView extends View {
//装载的饼状圆数据
private List<CakeBean> beanList;
//画圆的矩形
private RectF mRectF;
//右边的小矩形
private RectF iRectF;
private Paint mPaint;
private int mRWidth, mRHeight;
private float rotateDegree;//每个圆弧的起始角度
private float sumValue = 0;//所有值的和
private float diameter;//圆的直径
private float textY;//绘制文字的Y坐标 private float mRectHeight = 40;//矩形高度
private float mRectWidth = 80;//矩形宽度
private float mMargin = 40;//矩形和圆的距离
private Context mContext; public CakeView(Context context) {
//CakeView cakeView=new CakeView(context);
// 在代码中new CakeView()会调用这个构造函数
this(context, null);
} public CakeView(Context context, AttributeSet attrs) {
//InflateLayoutManager时会调用这个构造函数
this(context, attrs, 0);
} public CakeView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
init();
} private void init() {
beanList = new ArrayList<>();
mRectF = new RectF();
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//MeasureSpec封装了父View传递给子View的布局要求
int wMode = MeasureSpec.getMode(widthMeasureSpec);
int wSize = MeasureSpec.getSize(widthMeasureSpec);
int hMode = MeasureSpec.getMode(heightMeasureSpec);
int hSize = MeasureSpec.getSize(heightMeasureSpec);
switch (wMode) {
case MeasureSpec.EXACTLY:
//相当于match_parent或者一个具体值
mRWidth = wSize;
break;
case MeasureSpec.AT_MOST:
// 相当于wrap_content 默认会充满父View
// 可以根据子View的大小来计算父View大小,这里先写死大小
mRWidth = (int) DpUtil.dp2px(mContext, 400f);
break;
case MeasureSpec.UNSPECIFIED:
//很少会用到
break;
default:
break;
}
switch (hMode) {
case MeasureSpec.EXACTLY:
//相当于match_parent或者一个具体值
mRHeight = hSize;
break;
case MeasureSpec.AT_MOST:
// 相当于wrap_content 默认会充满父View
// 可以根据子View的大小来计算父View大小,这里先写死大小
mRHeight = (int) DpUtil.dp2px(mContext, 200f);
break;
case MeasureSpec.UNSPECIFIED:
//很少会用到
break;
default:
break;
}
//存储测量好的宽和高
setMeasuredDimension(wSize, hSize);
} @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
diameter = Math.min(mRWidth, mRHeight);
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
textY = 0f;
//设置圆形绘制的范围
mRectF.set(0, 0, diameter, diameter);
//画布中心X坐标向右移动(控件宽度-圆直径)之差的八分之一的距离
//画布中心Y坐标向下移动(控件宽度-圆直径)之差的二分之一的距离
canvas.translate((mRWidth - diameter) / 8, (mRHeight - diameter) / 2);
if (beanList.size() > 0 && Float.compare(sumValue, 0.0f) != 0) {
for (int i = 0; i < beanList.size(); i++) {
CakeBean bean = beanList.get(i);
//画圆弧
mPaint.setColor(bean.mColor);
canvas.drawArc(mRectF, rotateDegree, bean.degree, true, mPaint);
rotateDegree += bean.degree;
//画矩形和文字
drawRectAndText(canvas, bean);
}
}
} private void drawRectAndText(Canvas canvas, CakeBean bean) {
iRectF = new RectF();
//设置画矩形的范围
float left = diameter + mMargin;
float right = diameter + mMargin + mRectWidth;
float bottom = textY + mRectHeight;
iRectF.set(left, textY, right, bottom);
canvas.drawRect(iRectF, mPaint);
//设置颜色
mPaint.setColor(Color.BLACK);
//设置文字大小
mPaint.setTextSize(30);
//画文字
canvas.drawText(bean.name + "(" + new DecimalFormat(".00").format(bean.value / sumValue * 100) + "%)", right + 10, textY + 30, mPaint);
textY += mRectHeight;
} /**
* 饼状图添加数据
*
* @param beans CakeBean数据
*/
public void setData(List<CakeBean> beans) {
if (beans == null || beans.size() <= 0) return;
for (int i = 0; i < beans.size(); i++) {
CakeBean bean = beans.get(i);
sumValue += bean.value;
}
for (int i = 0; i < beans.size(); i++) {
CakeBean bean = beans.get(i);
bean.degree = bean.value / sumValue * 360;
beanList.add(bean);
}
invalidate();
} /**
* @param startDegree 设置起始角度
*/
public void setStartDegree(float startDegree) {
this.rotateDegree = startDegree;
invalidate();
}
}
package com.loaderman.customviewdemo; import java.io.Serializable; public class CakeBean implements Serializable {
public String name;//名字
public float value;//值
public float degree;//旋转过的角度
public int mColor;//圆弧颜色
}
package com.loaderman.customviewdemo; import android.app.Activity;
import android.content.Context;
import android.util.DisplayMetrics; /**
* Created by MQ on 2016/12/16.
*/ public class DpUtil {
/**
* dp转换成px
*
* @param context Context
* @param dp dp
* @return px值
*/
public static float dp2px(Context context, float dp) {
final float scale = context.getResources().getDisplayMetrics().density;
return dp * scale + 0.5f;
} /**
* sp转换成px
*
* @param context Context
* @param sp sp
* @return px值
*/
public static float sp2px(Context context, float sp) {
final float scale = context.getResources().getDisplayMetrics().scaledDensity;
return sp * scale;
} /**
* 获得屏幕宽度
*
* @param context Context
* @return 屏幕宽度(像素)
*/
public static int getScreenSizeWidth(Context context) {
DisplayMetrics metric = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(metric);
return metric.widthPixels;
}
}
package com.loaderman.customviewdemo; import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity {
private List<CakeBean> beans;
private String[] names = {"php", "object-c", "c", "c++", "java", "android", "linux"};
private float[] values = {2f, 2f, 3f, 4f, 5f, 6f, 7f};
private int[] colArrs = {Color.RED, Color.parseColor("#4ebcd3"), Color.MAGENTA, Color.YELLOW, Color.GREEN, Color.parseColor("#f68b2b"), Color.parseColor("#6fb30d")};//圆弧颜色
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CakeView cake_view = (CakeView) findViewById(R.id.cake_view);
initData();
cake_view.setData(beans); } private void initData() {
beans = new ArrayList<>();
for (int i = 0; i < 7; i++) {
CakeBean bean = new CakeBean();
bean.name = names[i];
bean.value = values[i];
bean.mColor = colArrs[i];
beans.add(bean);
}
} }
效果图:
自定义View饼状图的绘制的更多相关文章
- 基于SpringMVC框架使用ECharts3.0实现折线图,柱状图,饼状图,的绘制(上篇)
页面部分 <%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE html> ...
- matplotlib学习日记(五)-各种饼状图的绘制
(一)分裂式饼状图 import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np mpl.rcParams[& ...
- Android中饼状图的绘制
https://blog.csdn.net/cen_yuan/article/details/52204281
- Android 自定义饼状图
github 地址:https://github.com/dkest/PieView 简单分析 其实根据我们上面的知识已经能自己制作一个饼状图了.不过制作东西最重要的不是制作结果,而是制作思路. 相信 ...
- 【 D3.js 进阶系列 — 6.2 】 饼状图的拖拽
本文讲解稍微复杂一些的拖拽应用,即拖拽饼图的各部分. 在[入门 - 第 9.1 章]讲解了如何制作饼状图.饼状图的各部分是用具有宽度的弧线来表示的.在与用户进行交互的时候,如果每一部分都能拖拽,是很有 ...
- 第三方Charts绘制图表四种形式:饼状图,雷达图,柱状图,直线图
对于第三方框架Charts(Swift版本,在OC项目中需要添加桥接头文件),首先要解决在项目中集成的问题,集成步骤: 一.下载Charts框架 下载地址:https://github.com/dan ...
- DevExpress使用之ChartControl控件绘制图表(多坐标折线图、柱状图、饼状图)
最近因为公司项目需要用到WinForm的DecExpress控件,在这里把一些使用方法总结一下. DevExpress中有一个专门用来绘制图表的插件ChartControl,可以绘制折线图.饼状图.柱 ...
- iOS:使用贝塞尔曲线绘制图表(折线图、柱状图、饼状图)
1.介绍: UIBezierPath :画贝塞尔曲线的path类 UIBezierPath定义 : 贝赛尔曲线的每一个顶点都有两个控制点,用于控制在该顶点两侧的曲线的弧度. 曲线的定义有四个点:起始点 ...
- C#绘制立体三维饼状图
转载自原文 C#绘制立体三维饼状图(超酷) 内容原文地址:LINK [翻译]Julijan Sribar著3D Pie Chart一个用于绘制立体三维饼状图的C#类库[简介]本文的想法就是创建一个独立 ...
随机推荐
- 使用redislive监控redis
redis监控工具redislive的安装 1. pip安装 如果主机没有pip先安装pip工具 wget --no-check-certificate https://github.com/pypa ...
- vue 内存数组变化监听
watch: { carts: { handler(val, oldVal) { subtotal(this.carts); console.log(this.carts) }, deep: true ...
- c++实现服务器和多个客户端的实时群聊通信
我们通过TCP/IP来实现多人聊天室,如果租一个服务器我们就可以实现全网的多人聊天室(不懂tcp/ip的点进来https://www.cnblogs.com/yskn/p/9335608.html)! ...
- springboot中使用servlet通过配置类
在servlet目录下创建个servlet类,示例代码如下: package com.bjpowernode.springboot.servlet; import javax.servlet.Serv ...
- 标准C语言(5)
无法预知的数字叫随机数,rand标准函数可以用来获得随机数,为了使用这个标准函数需要包含stdlib.h头文件 srand标准函数用来设置随机数种子,这个函数把一个整数作为种子使用不同的种子可以得到不 ...
- redis 和 memache 缓存的区别
总结一: 1.数据类型 Redis数据类型丰富,支持set list等类型 memcache支持简单数据类型,需要客户端自己处理复杂对象 2.持久性 redis支持数据落地持久化存储 memcache ...
- Spring-data-jpa操作数据库环境配置
application.xml文件 <?xml version="1.0" encoding="UTF-8"?><beans xmlns=&q ...
- 【转载】Java File操作汇总
转载自博客:https://passport.cnblogs.com/user/signin?ReturnUrl=https%3A%2F%2Fwww.cnblogs.com%2F 本文通过大量的示例, ...
- windows脚本复制文件(将u盘文件复制到固定路径)
@echo off for /f "tokens=2 delims==" %%a in ('wmic LogicalDisk where "VolumeName='Hel ...
- 【Winform-GataGridView】根据DataGridView中的数据内容设置行的文字颜色、背景色 — 根据状态变色
C#中可以根据每行内容的不同来对DataGridView数据表格控制每行的文字颜色.背景颜色进行不同的设置. 效果如下: 实现: 在DataGridView的RowPrePaint事件中进行行颜色控制 ...