Android 如何画圆饼图来表示智能机的市场份额
先让大家看一下效果图:
智能机的份额可能不太准确,仅仅是举例说明一下:
定制的View代码如下:
/**
*饼状图
*
* @author caicai
*
*/
@SuppressLint("ResourceAsColor")
public class RoundDistributionView extends View {
/**
* 饼状图的开始位置
*/
private int beginDegree;
/**
* 画笔对象的引用
*/
private Paint paint;
/**
* 写文字的画笔引用
*/
private Paint textPaint;
/**
* 圆环进度的颜色
*/
/**
* 中间进度百分比的字符串的颜色
*/
private int textColor;
/**
* 中间进度百分比的字符串的字体
*/
private float textSize;
private String[] distributionStrings = { "Android", "IOS", "WinPhone",
"Others" };
private int[] distributionPercents = { 60, 10, 10,20 };
private int[] colors = { Color.RED, Color.BLUE, Color.GREEN};
public RoundDistributionView(Context context) {
this(context, null);
}
public RoundDistributionView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RoundDistributionView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
paint = new Paint();
setDistributionStrings(getResources().getStringArray(R.array.name_distribution));
setDistributionPercents(getResources().getIntArray(R.array.percent_distribution));
setColors(getResources().getIntArray(R.array.colors));
TypedArray mTypedArray = context.obtainStyledAttributes(attrs,
R.styleable.RoundProgressBar);
// 获取自定义属性和默认值
textColor = mTypedArray.getColor(
R.styleable.RoundProgressBar_textColor, Color.GREEN);
textSize = mTypedArray.getDimension(
R.styleable.RoundProgressBar_textSize, 16);
beginDegree = mTypedArray.getInt(
R.styleable.RoundProgressBar_beginDegree, 0);
mTypedArray.recycle();
textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
textPaint.setTextSize(textSize);
textPaint.setColor(textColor);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/**
* 得到圆的圆心和半径
*/
int centre = getWidth() / 2; // 获取圆心的x坐标
int radius = centre; // 圆环的半径
paint.setStyle(Paint.Style.FILL); // 设置空心
paint.setAntiAlias(true); // 消除锯齿
canvas.drawCircle(centre, centre, radius, paint);
Log.e("log", centre + "");
/**
* 画圆弧,画扇形
*/
// 设置扇型是实心
RectF oval = new RectF(centre - radius, centre - radius, centre
+ radius, centre + radius); // 用于定义的圆弧的形状和大小的界限
paint.setStyle(Paint.Style.FILL_AND_STROKE);
for (int i = 0; i < colors.length; i++) {
paint.setColor(colors[i]);
int startPosition = 0;
int endPoisition = 0;
for (int j = 0; j < i; j++) {
startPosition += distributionPercents[j];
endPoisition += distributionPercents[j];
}
endPoisition += distributionPercents[i];
Log.e("log", "开始度数====" + 360 * startPosition / 100 + " 弧度===="
+ 360 * distributionPercents[i] / 100 + " 颜色:" + i);
canvas.drawArc(oval, beginDegree + 360 * startPosition / 100,
360 * distributionPercents[i] / 100, true, paint); // 根据进度画圆弧
/**
* 写市场份额百分比
*/
textPaint.setStrokeWidth(0);
textPaint.setTypeface(Typeface.DEFAULT_BOLD); // 设置字体
String displayText = distributionStrings[i] + ":"
+ distributionPercents[i] + "%";
float textWidth = textPaint.measureText(displayText); // 测量字体宽度,我们需要根据字体的宽度设置在扇型的平分线的中点
int middleDegree = beginDegree + 360
* (startPosition + endPoisition) / 2 / 100;
float positionX = ((float) (centre - textWidth / 2.0 + radius
* Math.cos(Math.toRadians(middleDegree)) / 2.0));
float positionY = (float) (centre + textSize / 2.0 + radius
* Math.sin(Math.toRadians(middleDegree)) / 2.0);
//Math.toRadians(middleDegree) 把度数转化成PI 360度等于2*PI 这条特别主要千万别忘了用这个函数Math.toRadians
canvas.drawText(displayText, positionX, positionY, textPaint);
}
}
public int[] getColors() {
return colors;
}
public void setColors(int[] colors) {
this.colors = colors;
}
public int getTextColor() {
return textColor;
}
public void setTextColor(int textColor) {
this.textColor = textColor;
}
public float getTextSize() {
return textSize;
}
public void setTextSize(float textSize) {
this.textSize = textSize;
}
public int getBeginDegree() {
return beginDegree;
}
public void setBeginDegree(int beginDegree) {
this.beginDegree = beginDegree;
}
public String[] getDistributionStrings() {
return distributionStrings;
}
public void setDistributionStrings(String[] distributionStrings) {
this.distributionStrings = distributionStrings;
}
public int[] getDistributionPercents() {
return distributionPercents;
}
public void setDistributionPercents(int[] distributionPercents) {
this.distributionPercents = distributionPercents;
}
}
attrs.xml文件(此文件在values文件夹下面)的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<declare-styleable name="RoundProgressBar">
<attr name="textColor" format="color" />
<attr name="textSize" format="dimension" />
<attr name="beginDegree" format="integer"></attr>
</declare-styleable>
</resources>
在strings.xml文件里面加入如下内容:
<integer-array
name="percent_distribution">
<item>65</item>
<item>25</item>
<item>15</item>
</integer-array>
<string-array name="name_distribution">
<item >Android</item>
<item >IOS</item>
<item >Others</item>
</string-array>
<array name="colors">
<item>#FFFF0000</item>
<item>#FF0000FF</item>
<item>#FF00FF00</item>
</array>
注意这三个数组的个数多少是一致的,第一个数组各个item的值之和为100(各自的市场份额百分比),第二个数组各自智能手机的名称,第三个数组为自己扇型图的背景色。
主Activity的layout文件内容如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:round_custom="http://schemas.android.com/apk/res/你的包名"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<你的包名.RoundDistributionView
android:layout_height="400dip"
android:layout_width="400dip"
android:layout_margin="40dip"
round_custom:textColor="#FFFFFFFF"
round_custom:beginDegree="90"
/>
</RelativeLayout>
注意上面的红色字体,xmlns:round_custom="http://schemas.android.com/apk/res/你的包名" round_custom是定制的前缀,只有在上面的attrs.xml文件中定义的属性才可以,如textColor,textSize,beginDegree等属性。
希望对大家有所帮助。
Android 如何画圆饼图来表示智能机的市场份额相关推荐
- canvas画条形图 微信小程序_小程序-引入 echart 图表画圆饼图
前言 在 web 中引入echart可视化图表是很常见的操作,那在小程序当中又如何引入使用呢 示例效果 完整示例效果-可以点击此处查看 下载使用 ec-canvas 在github上下载echarts ...
- android xml画圆,Android自定义View画圆功能
本文实例为大家分享了Android自定义View画圆的具体代码,供大家参考,具体内容如下 引入布局 xmlns:tools="http://schemas.android.com/tools ...
- android 画圆教程,android shap画圆(空心圆、实心圆)
实心圆: android:shape="oval" android:useLevel="false"> android:width="1dp&q ...
- android canvas 画圆边缘模糊,Android canvas画圆
布局 android:id="@+id/ballView2" android:layout_width="match_parent" android:layou ...
- Android画布画圆,android_studio的canvas画圆
1.怎样设置代码 package com.example.rk1130; import android.content.Context; import android.graphics.Canvas; ...
- Android自定义睡眠下表统计图,Android 进阶自定义View(5)图表统计PieChartView圆饼图的实现...
今天讲图表统计中比较常用的一个,像支付宝的月账单啥的,都是用圆饼图来做数据统计的,先看一下我最终实现的效果图: image.png 该效果实际上是两个实心圆叠加后的效果. image.png imag ...
- Android 自定义view 图片编辑(画圆,画长方形,手势缩放)
Android 自定义view 图片编辑(画圆,画长方形,手势缩放) package com.bridgetek.yqm.view; import android.annotation.Suppres ...
- Android 自定义View 画圆(奥运五环)
效果图 前言 你会画画吗?你会写代码吗?你会用代码画画吗? 正文 自定义View,实际开发过程中,因为涉及用户体验的时候,UI通常会弄一些骚操作出来,这个时候就有两个选择,你是用GIF呢?还是自己自定 ...
- android自动画线,android中实现自定义画线,画圆,画矩形,使用自定义字体
首先,新建xml文件,resource type为drawble,root element为shape 一.自定义画线 android:shape="line" > andr ...
最新文章
- python保存文件到指定文件夹_python实现指定文件夹下的指定文件移动到指定位置...
- MySQL的explain简书_MySQL Explain
- 机器学习降维算法四:Laplacian Eigenmaps 拉普拉斯特征映射
- css3新增特性集合贴
- Tomcat container 内部容器
- [FZYZOJ 1202] 金坷垃
- ChaiNext:比特币打穿4.2万美元,市场多空胶着
- python 3.7.4 shell_centos7上Virtualenv从python3.4升级到Python3.7.4
- Android Studio下载Gradle一直失败,使用正确的下载地址
- jracdrive变频器说明书580_ABB变频器ACS580说明书.pdf
- 阿里云SLB负载均衡ESS弹性伸缩
- wpf之pdf的显示
- 华为鸿蒙系统操作教程_鸿蒙OS Beta版怎么使用
- Android Manager之SensorManager---距离传感器
- js清空本地存储_前端存储除了 localStorage 还有啥
- httpcanary和fiddler的使用教程
- Python-被7整除
- Datagrid striped 不工作?
- python比赛积分类算法题_python常用算法题
- Windows 10 的系统要求
热门文章
- Web系统中出现 localhost 将您重定向的次数过多问题
- 贪心算法求解一个序列中出现次数最多的元素问题
- 前端搞工程化:从零打造性能检测库「源码 + 视频」
- Codeforces 1592A
- 家庭影院、“私有云”存储服务器及群晖系统的搭建
- c语言编程在线菜鸟,C语言编程 菜鸟练习100题(01-10)
- 计算机网络校园网设计讨论与分析,浅论无线校园网系统分析与设计_计算机网络毕业论文...
- 图文解答之最短路径||
- 长春财经学院计算机专业多少分录取,长春财经学院2020录取分数线(附2017-2020年分数线)...
- 关于梦想是计算机的作文英语,关于的梦想英语作文