先让大家看一下效果图:

智能机的份额可能不太准确,仅仅是举例说明一下:

定制的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 如何画圆饼图来表示智能机的市场份额相关推荐

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

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

  2. android xml画圆,Android自定义View画圆功能

    本文实例为大家分享了Android自定义View画圆的具体代码,供大家参考,具体内容如下 引入布局 xmlns:tools="http://schemas.android.com/tools ...

  3. android 画圆教程,android shap画圆(空心圆、实心圆)

    实心圆: android:shape="oval" android:useLevel="false"> android:width="1dp&q ...

  4. android canvas 画圆边缘模糊,Android canvas画圆

    布局 android:id="@+id/ballView2" android:layout_width="match_parent" android:layou ...

  5. Android画布画圆,android_studio的canvas画圆

    1.怎样设置代码 package com.example.rk1130; import android.content.Context; import android.graphics.Canvas; ...

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

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

  7. Android 自定义view 图片编辑(画圆,画长方形,手势缩放)

    Android 自定义view 图片编辑(画圆,画长方形,手势缩放) package com.bridgetek.yqm.view; import android.annotation.Suppres ...

  8. Android 自定义View 画圆(奥运五环)

    效果图 前言 你会画画吗?你会写代码吗?你会用代码画画吗? 正文 自定义View,实际开发过程中,因为涉及用户体验的时候,UI通常会弄一些骚操作出来,这个时候就有两个选择,你是用GIF呢?还是自己自定 ...

  9. android自动画线,android中实现自定义画线,画圆,画矩形,使用自定义字体

    首先,新建xml文件,resource type为drawble,root element为shape 一.自定义画线 android:shape="line" > andr ...

最新文章

  1. python保存文件到指定文件夹_python实现指定文件夹下的指定文件移动到指定位置...
  2. MySQL的explain简书_MySQL Explain
  3. 机器学习降维算法四:Laplacian Eigenmaps 拉普拉斯特征映射
  4. css3新增特性集合贴
  5. Tomcat container 内部容器
  6. [FZYZOJ 1202] 金坷垃
  7. ChaiNext:比特币打穿4.2万美元,市场多空胶着
  8. python 3.7.4 shell_centos7上Virtualenv从python3.4升级到Python3.7.4
  9. Android Studio下载Gradle一直失败,使用正确的下载地址
  10. jracdrive变频器说明书580_ABB变频器ACS580说明书.pdf
  11. 阿里云SLB负载均衡ESS弹性伸缩
  12. wpf之pdf的显示
  13. 华为鸿蒙系统操作教程_鸿蒙OS Beta版怎么使用
  14. Android Manager之SensorManager---距离传感器
  15. js清空本地存储_前端存储除了 localStorage 还有啥
  16. httpcanary和fiddler的使用教程
  17. Python-被7整除
  18. Datagrid striped 不工作?
  19. python比赛积分类算法题_python常用算法题
  20. Windows 10 的系统要求

热门文章

  1. Web系统中出现 localhost 将您重定向的次数过多问题
  2. 贪心算法求解一个序列中出现次数最多的元素问题
  3. 前端搞工程化:从零打造性能检测库「源码 + 视频」
  4. Codeforces 1592A
  5. 家庭影院、“私有云”存储服务器及群晖系统的搭建
  6. c语言编程在线菜鸟,C语言编程 菜鸟练习100题(01-10)
  7. 计算机网络校园网设计讨论与分析,浅论无线校园网系统分析与设计_计算机网络毕业论文...
  8. 图文解答之最短路径||
  9. 长春财经学院计算机专业多少分录取,长春财经学院2020录取分数线(附2017-2020年分数线)...
  10. 关于梦想是计算机的作文英语,关于的梦想英语作文