Android 饼图绘制

private BlurMaskFilter PaintBGBlur;
private int ScrHeight;
private int ScrWidth;
private Paint[] arrPaintArc;
private Paint PaintText = null;
private Path pathArc = null;
private RectF arcRF0 = null;
private int[] colors = new int[] { Color.RED, Color.BLUE, };
// 演示用的比例,实际使用中,即为外部传入的比例参数
private int arrPer[] = new int[] { 100, 0 };

private String typeText[] = new String[] {"已读","未读"};

private int total = 0;

public ChartContentView(Context context, int[] colors, int[] per, String[] typeText) {
super(context);

// 初始化数据
initData(colors, per, typeText);

initView();
}

/**
* 初始化页面
*/
private void initView() {
// 解决4.1版本以下canvas.drawTextOnPath()不显示问题
this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
// 屏幕信息
DisplayMetrics dm = getResources().getDisplayMetrics();
ScrHeight = dm.heightPixels;
ScrWidth = dm.widthPixels;
// 设置边缘特殊效果
PaintBGBlur = new BlurMaskFilter(1, BlurMaskFilter.Blur.INNER);

arrPaintArc = new Paint[colors.length];
for (int i = 0; i < colors.length; i++) {
arrPaintArc[i] = new Paint();
arrPaintArc[i].setColor(colors[i]);
arrPaintArc[i].setStyle(Paint.Style.FILL);
arrPaintArc[i].setStrokeWidth(4);
arrPaintArc[i].setMaskFilter(PaintBGBlur);
}

PaintText = new Paint();
PaintText.setColor(Color.BLACK);
PaintText.setTextSize(25);
PaintText.setTypeface(Typeface.DEFAULT_BOLD);

pathArc = new Path();
arcRF0 = new RectF();
}

public void onDraw(Canvas canvas) {
// 画布背景
canvas.drawColor(Color.TRANSPARENT);

if (arrPer.length > arrPaintArc.length || arrPer.length > colors.length || arrPer.length > typeText.length || arrPer.length <= 0) {
return;
}

float cirX = ScrWidth / 2;
float cirY = ScrHeight / 3;
float radius = ScrHeight / 5;

float arcLeft = cirX - radius;
float arcTop = cirY - radius;
float arcRight = cirX + radius;
float arcBottom = cirY + radius;
arcRF0.set(arcLeft, arcTop, arcRight, arcBottom);
// x,y,半径,CW为顺时针绘制
pathArc.addCircle(cirX, cirY, radius, Direction.CW);
// 绘出饼图大轮廓
canvas.drawPath(pathArc, arrPaintArc[0]);
float CurrPer = 0f; // 偏移角度
float Percentage = 0f; // 当前所占比例
int scrOffsetW = ScrWidth - 200;
int scrOffsetH = ScrHeight - 300;
int scrOffsetT = 40;

for (int i = 0; i < arrPer.length; i++) {
if (i != 0) {
// 将百分比转换为饼图显示角度
Percentage = 360 * ((float) arrPer[i] / (float) total);
Percentage = (float) (Math.round(Percentage * 100)) / 100;
// 在饼图中显示所占比例
canvas.drawArc(arcRF0, CurrPer, Percentage, true,
arrPaintArc[i]);
}

// 当前颜色
canvas.drawRect(scrOffsetW - 60, scrOffsetH + i * scrOffsetT,
scrOffsetW, scrOffsetH - 30 + i * scrOffsetT,
arrPaintArc[i]);
// 当前比例
canvas.drawText(typeText[i] + String.valueOf(arrPer[i]) + "条",
scrOffsetW, scrOffsetH + i * scrOffsetT, PaintText);

// 下次的起始角度
CurrPer += Percentage;
}

}

/**
* 改变数据,刷新画面
*
* @param colors
* @param per
* @param typeText
*/
public void changeData(int[] colors, int[] per, String[] typeText) {
initData(colors, per, typeText);

invalidate();
}

/**
* 初始化数据
*
* @param colors
* @param per
* @param typeText
*/
private void initData(int[] colors, int[] per, String[] typeText) {
if (colors != null && colors.length > 0) {
this.colors = colors;
}
else {
this.colors = new int[] {};
}
total = 0;
if (per != null && per.length > 0) {
this.arrPer = per;
for (int i = 0; i < per.length; i++) {
total += per[i];
}
}
else {
this.arrPer = new int[] {};
}
if (typeText != null && typeText.length > 0) {
this.typeText = typeText;
}
else {
this.typeText = new String[] {};
}
}

Android 饼图绘制

时间: 2024-10-06 00:53:26

Android 饼图绘制的相关文章

Android 图表绘制 achartengine 示例解析

作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/38420197 一. AChartEngine 简介 1. 项目地址 AChartEngine 简介 : AChartEngine 是 Android 平台的图表开发库, 能绘制 折线图, 饼图, 气泡图, 柱状图, 散点图, 面积图等统计图表; 最新版本 : 1.1.0 版本; AChartEngine 地址 : https://code.google.co

Android UI 绘制过程浅析(五)自定义View

前言 这已经是Android UI 绘制过程浅析系列文章的第五篇了,不出意外的话也是最后一篇.再次声明一下,这一系列文章,是我在拜读了csdn大牛郭霖的博客文章<带你一步步深入了解View>后进行的实践. 前面依次了解了inflate的过程,以及绘制View的三个步骤:measure, layout, draw.这一次来亲身实践一下,通过自定义View来加深对这几个过程的理解. 自定义View的分类 根据实现方式,自定义View可以分为以下3种类型. 自绘控件.View的绘制代码(onDraw

【转】Android Shape绘制虚线在手机端查看是实线的问题

Android share绘制虚线在手机上显示实线问题 原文博客链接:http://wv1124.iteye.com/blog/2187204 博客分类: Android 可以说这是一个Bug, 据说在4.0以上机器会出现,我测试是android 4.4.2 Xml代码   <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android

android精确绘制文字位置的方法

android 中使用Canvas的drawText绘制文本的位置,是基于基线的.如下图: 其中字母Q的小尾巴在横线下面了. 怎么样找准字母的中心位置呢? 先看下面的例子:(右边的数字,表示字体的 left, top, right, bottom) 这里面的关键是Paint.getTextBound. getTextBound会填充一个Rect,这个Rect表示的就是一个字的left, top, right, bottom.注意到left和top并不是从0,0开始的. left和right应该是

简单研究Android View绘制一

2015-07-27 16:52:58 一.如何通过继承ViewGroup来实现自定义View?首先得搞清楚Android时如何绘制View的,参考Android官方文档:How Android Draws Views 以下翻译摘自:http://blog.csdn.net/linghu_java/article/details/23882681,这也是一片好文章,推荐大家看看- When an Activity receives focus, it will be requested to d

Android Canvas绘制

public class DrawView extends View { public DrawView(Context context) {  super(context); } @Override protected void onDraw(Canvas canvas) {  super.onDraw(canvas);  /*   * 方法 说明 drawRect 绘制矩形 drawCircle 绘制圆形 drawOval 绘制椭圆 drawPath 绘制任意多边形   * drawLine

简单研究Android View绘制三 布局过程

2015-07-28 17:29:19 这一篇主要看看布局过程 一.布局过程肯定要不可避免的涉及到layout()和onLayout()方法,这两个方法都是定义在View.java中,源码如下: 1 /** 2 * Assign a size and position to a view and all of its 3 * descendants 4 * 5 * <p>This is the second phase of the layout mechanism. 6 * (The fir

【UI】android如何绘制一个饼图

代码下载 需求 1:实心饼图,颜色填充百分比区域 2:带区域说明 3:饼图有阴影 思路:这个其实和绘制进度条原理差不多,都是360度根据所占百分比算出绘制弧度,然后调用canvas的画弧函数. 阴影其实是一个空心圆,使用原生RadialGradient圆形渐变,颜色从黑色到透明,达到阴影效果. 右侧圆角方形是在安卓5.0新引入的drawRoundRect函数.安卓5.0以下绘制方形

Android如何绘制视图,解释了为何onMeasure有时要调用多次(转)

当Activity获取焦点的时候,它就需要绘制布局.Android框架会处理绘制过程,但这个Activity必须提供它布局树的根节点. 绘制过程是从布局的根节点开始的.这个过程需要测量和绘制布局树.绘制过程是通过遍历树和渲染每个与绘制区域相交的视图来处理的.接下来,ViewGroup职责就是请求它的每个子视图都会绘制(使用draw()方法),同时View的职责就是绘制自身.由于这个树都是依序遍历,这就意味着这个父视图会在子视图之前绘制,并且会按照出现在树中的顺序绘制它们的兄弟姐妹. 框架不会绘制