自定義圓環(huán)百分占比view (label文字支持自動(dòng)換行 和設(shè)置顯示行數(shù))

按照國際慣例邑蒋,先上效果圖

1.png
2.png
3.png

數(shù)據(jù)結(jié)構(gòu)

從圖可以看出我們需要標(biāo)志類型的label 數(shù)量value 所占的角度angle 還有代表的顏色邦鲫,得出數(shù)據(jù)結(jié)構(gòu)如下

public static class Entry implements Comparable {
        public String label;
        public int value;
        public float angle;
        public int color;

        public Entry(String label, int value) {
            this.label = label;
            this.value = value;
        }

        @Override
        public int compareTo(@NonNull Object o) {
            Entry e = (Entry) o;
            if (value > e.value)
                return -1;
            if (value < e.value)
                return 1;
            return 0;
        }
    }

需求分析

按照數(shù)據(jù)總數(shù)平分一個(gè)圓锐峭,但是可能存在不能整分的情況斤彼,還有可能分的角度太小都看不到。

  • 最小角度為2银锻,小于2度的設(shè)置成2度肉瓦,方便查看
  • 按照Entry 的value 值分配角度e.angle = (360.0f * e.value) / count + arrearage;(count總個(gè)數(shù)遭京,arrearage為上一個(gè)虧欠的度數(shù))
  • 上面虧欠的度數(shù)arrearage = e.angle - 2f (<0) ,由下一個(gè)項(xiàng)目補(bǔ)償
  • 如果全部計(jì)算完畢之后arrearage < 0 胃惜,既還有欠費(fèi),那么再循環(huán)一遍哪雕,重新分配一次
  • 為了簡化程序船殉,arrearage 虧欠補(bǔ)償是由下一個(gè)補(bǔ)償?shù)模瑳]有考慮平均分?jǐn)側燃啵抑挥醒a(bǔ)償之后e.angle + arrearage > 2 角度仍然大于2度的才有資格替上面一個(gè)補(bǔ)償虧欠

代碼

注釋已經(jīng)寫的很清楚了捺弦,這里就不再解釋,具體的坐標(biāo)計(jì)算了孝扛,里面包括了一些數(shù)學(xué)的東西列吼,橢圓的知識(shí)忘了可以百度一下,還有解決了TextPaint 繪制文字重疊不自動(dòng)換行的問題苦始,具體參考 Canvas的drawText繪制文本自動(dòng)換行(支持設(shè)置顯示最大行數(shù))寞钥。

自定義view : PieChart.java

public class PieChart extends View {

    ArrayList<Entry> mDataSet = new ArrayList<>();
    Paint mPaint;
    //寫小圓文字 自動(dòng)換行和限制最大行數(shù)
    private TextPaint mTextPain;
    private static final int MAX_LINE = 2;

    public PieChart(Context context) {
        super(context);
        init();
    }

    public PieChart(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public PieChart(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public PieChart(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    /**
     *
     * @param data 由于CompanyInfo 限制,最多只有 6個(gè)數(shù)據(jù)項(xiàng)
     * @param centerText
     */
    public void setData(ArrayList<Entry> data, String centerText) {
        mDataSet.clear();
        if (data != null) {
            mDataSet.addAll(data);
        }
        mCenterText = centerText;
        preCalcute();
        this.requestLayout();
    }


    public void setData(String[] labels, int values[], String centerText) {
        mDataSet.clear();
        for (int i = 0; i < labels.length; i++) {
            mDataSet.add(new Entry(labels[i], values[i]));
        }
        mCenterText = centerText;
        preCalcute();
        this.requestLayout();
    }


    // 計(jì)算角度陌选,顏色
    private void preCalcute() {
        //計(jì)算 顏色(最大->最小 按COLORS數(shù)字依次分配理郑,所以先排序
        ArrayList<PieChart.Entry> tmp = new ArrayList<>(mDataSet.size());
        tmp.addAll(mDataSet);

        Collections.sort(tmp);

        int i = 0;
        for (Entry e : tmp) {
            e.color = COLORS[i++];
        }

        if (mSortData) {
            Collections.sort(mDataSet);
        }

        int count = 0;
        for (Entry e : mDataSet) {
            count += e.value;
        }

        mCount = count;
        //計(jì)算角度
        float arrearage = 0;//用于補(bǔ)償?shù)闹虚g變量,初始化0
        for (Entry e : mDataSet) {
            e.angle = (360.0f * e.value) / count + arrearage;
            // 角度太小咨油,就畫不出來了,所以設(shè)置最小角度為2您炉,把多占用的讓下一個(gè)承擔(dān)
            if (e.angle < 2f) {
                arrearage = e.angle - 2f;//這是欠的度數(shù)
                e.angle = 2;
            } else {
                arrearage = 0;
            }
        }
        if (arrearage < 0) {//最后還有欠費(fèi),就再循環(huán)一遍役电,讓大家(下一個(gè))分擔(dān)下欠費(fèi)
            for (Entry e : mDataSet) {
                if (e.angle + arrearage > 2) {//如果分擔(dān)后仍然大于2赚爵,就讓他分擔(dān)
                    e.angle += arrearage;
                    break;
                }
            }
        }

        Locale locale = Locale.getDefault();
        if (tmp.size() < 6) {//下面的小圓小于6個(gè)
            singleItemWidth = convertDpToPixel(63);
        } else {
            singleItemWidth = convertDpToPixel(56);
        }

        if (locale.getLanguage().toLowerCase().startsWith("zh")) {
            textSizeLabel = convertDpToPixel(14);
        } else {
            if (tmp.size() < 6) {
                textSizeLabel = convertDpToPixel(13);
            } else {
                textSizeLabel = convertDpToPixel(11);
            }
        }
    }

    //是否需要對(duì)數(shù)據(jù)進(jìn)行排序
    boolean mSortData;

    public void setSort(boolean sort) {
        mSortData = sort;
    }

    //預(yù)制顏色,從大到小
    final int COLORS[] = {0xFF00A7CF, 0xFF8E7BE6, 0xFF0179B1, 0xFF73AC1A, 0xFFF5B910, 0xFFA5BBD1,
            0xFF00A7CF, 0xFF8E7BE6, 0xFF0179B1, 0xFF73AC1A, 0xFFF5B910, 0xFFA5BBD1,};

    //中心的文字“總量”多語言由外面?zhèn)魅?    String mCenterText;
    //總量
    int mCount;

    private void init() {
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mTextPain = new TextPaint();
        mTextPain.setAntiAlias(true);
    }

    // 上下padding
    float padding = convertDpToPixel(12);
    // 大圓的半徑
    float radius = convertDpToPixel(65);
    // 圓環(huán)的寬度
    float border = radius / 4;
    // 小圓半徑
    float sradius = convertDpToPixel(15);

    //大圓心 數(shù)字大小
    float textSizeBigCount = convertDpToPixel(18);
    //大圓心 文字大小
    float textSizeBigCircle2 = convertDpToPixel(20);
    // label文字大小
    float textSizeLabel = convertDpToPixel(14);
    // label數(shù)字字大小
    float textSizeSmallCount = convertDpToPixel(12);
    //線條的寬度
    float lineStrokeWidth = convertDpToPixel(1);
    //陰影的半徑
    float shadownRadisu = convertDpToPixel(2);
    //總量的間距
    float paddingTotal = convertDpToPixel(5);
    //下面圓與上面圓的間距
    float paddingBottomCircle = convertDpToPixel(15);
    //下面每一個(gè)item的寬度
    float singleItemWidth = convertDpToPixel(61);

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //背景涂成白色
        canvas.drawColor(0xffffffff);
        int width = getWidth();
        int height = getHeight();

        //計(jì)算圓心法瑟,
        float cx = width / 2;
        float cy = radius + padding;//加上頂部偏移冀膝,美觀一點(diǎn)

        mPaint.setColor(Color.WHITE);
        float strokeWidth = mPaint.getStrokeWidth();

        //繪制圓環(huán)的陰影
//        setLayerType(LAYER_TYPE_SOFTWARE,mPaint);
        mPaint.setShadowLayer(shadownRadisu, 0, shadownRadisu, 0xffAAAAAA);//第一個(gè)參數(shù)為模糊半徑,越大越模糊霎挟。 第二個(gè)參數(shù)是陰影離開文字的x橫向距離窝剖。 第三個(gè)參數(shù)是陰影離開文字的Y橫向距離。 第四個(gè)參數(shù)是陰影顏色
        mPaint.setStrokeWidth(border + shadownRadisu / 2);//圓環(huán)的著色寬度  1/4大圓環(huán)半徑的+1/2 外部陰影寬度
        mPaint.setColor(Color.WHITE);
        mPaint.setStyle(Paint.Style.STROKE);//白色 描邊
        //內(nèi)部圓環(huán) + 圓環(huán) +陰影
        canvas.drawCircle(cx, cy, radius - border / 2, mPaint);

        //取消陰影
        mPaint.clearShadowLayer();
        //恢復(fù)線框?qū)挾?        mPaint.setStyle(Paint.Style.FILL);

        //對(duì)于如果只有2個(gè)數(shù)據(jù)酥夭,繪制線條赐纱, label
        if (mDataSet.size() == 2) {
            //繪制線條
            float ex = 0, ey = 0;
            // 橢圓方程 (x/a)^2+(y/b)^2=1
            float b = radius + border / 4;//比圓多1/16半徑做橢圓短軸
            float a = radius + border;//比圓多1/4半徑做橢圓長軸
         /*  paint.setColor(Color.RED);
            for(float x=-a;x<a;x++){
                float y =(float) Math.sqrt(( 1 - x*x/(a*a))*b*b);
                canvas.drawPoint(cx+x,cy+y,paint);
                canvas.drawPoint(cx+x,cy-y,paint);
            }*/
            mPaint.setStrokeWidth(lineStrokeWidth);

            //繪制 2個(gè) 線條和文字label
            float tmp = 0;
            for (int i = 0; i < mDataSet.size(); i++) {
                Entry e = mDataSet.get(i);
                int sg = 1;
                //所占圓環(huán)中心角度 加上上一個(gè)角度如果小于180 畫右邊設(shè)置右對(duì)齊
                //這個(gè)是為了讓上下兩個(gè)圖的文字靠近圓環(huán)端能夠?qū)R在一條直線上
                if (tmp + e.angle / 2 > 180) {
                    sg = -1;
                    mPaint.setTextAlign(Paint.Align.RIGHT);
                } else {
                    mPaint.setTextAlign(Paint.Align.LEFT);
                }
                float angle = e.angle;
                if (angle > 180) {
                    angle = 240;
                } else {
                    if (angle > 120)
                        angle = 120;
                }
                //圓環(huán)上所占區(qū)域中心點(diǎn)到原點(diǎn) 與Y軸的夾角
                angle = (float) ((angle / 2) * Math.PI / 180);
                float k2 = (float) (1 / Math.tan(angle));

                //圓環(huán)上所占區(qū)域中心點(diǎn)到原點(diǎn)直線與 橢圓的交點(diǎn)坐標(biāo)
                ex = (float) Math.sqrt(1 / (1 / (a * a) + (k2 * k2) / (b * b)));
                ey = k2 * ex;

                //圓環(huán)上所占區(qū)域中心點(diǎn)到原點(diǎn)直線與 圓的交點(diǎn)坐標(biāo)
                float sx = cx + sg * (float) (radius * Math.sin(angle));
                float sy = cy - (float) (radius * Math.cos(angle));

                //最邊上(左右邊)到文字對(duì)齊的線的距離(默認(rèn)大小為 半徑 + 1/8 半徑) 既給文字 + 橫線(1/8 半徑)  留出的寬度
                float linepad = radius + border * 2;

                mPaint.setColor(e.color);
                //圓環(huán)上的點(diǎn)到橢圓上的點(diǎn)的斜線
                canvas.drawLine(sx, sy, cx + sg * ex, cy - ey, mPaint);
                //橢圓上的點(diǎn)到文字邊上的 橫線(border * 2)
                canvas.drawLine(cx + sg * ex, cy - ey, cx + sg * (linepad), cy - ey, mPaint);
                //畫文字描述(這里太長會(huì)跑出界面,如果需要處理熬北,請(qǐng)參考下面小圓文字的處理)
                mPaint.setColor(0xff5f5f5f);
                mPaint.setTextSize(textSizeLabel);
                canvas.drawText(e.label, cx + sg * (linepad) + sg * textSizeLabel / 2, cy - ey + textSizeLabel * 1 / 3, mPaint);
                tmp += e.angle;//下一個(gè)圓環(huán)區(qū)域中心點(diǎn)的起始角度
            }
        }

        //再繪制白色圓環(huán)千所,把外邊緣的白色漏出來(再畫一次,)
        mPaint.setColor(Color.WHITE);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(border + shadownRadisu / 2);
        canvas.drawCircle(cx, cy, radius - border / 2, mPaint);

        mPaint.setStrokeWidth(strokeWidth);

        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        canvas.save();
        //剪切內(nèi)小圓蒜埋,再繪制扇形,就成了扇形圓環(huán)
        Path path = new Path();
        path.addCircle(cx, cy, radius - border, Path.Direction.CCW);
        canvas.clipPath(path, Region.Op.DIFFERENCE);
        float startAngle = -90f;//12點(diǎn)位置
        //內(nèi)圓環(huán)的外接正方形
        RectF arcRect = new RectF(cx - radius, cy - radius, cx + radius, cy + radius);
        for (int i = 0; i < mDataSet.size(); i++) {//繪制扇形圓環(huán)
            Entry e = mDataSet.get(i);
            mPaint.setColor(e.color);
            //留1個(gè)角度的空白
            canvas.drawArc(arcRect, startAngle, e.angle == 360 ? e.angle : (e.angle - 1), true, mPaint);
            startAngle += e.angle;
        }
        canvas.restore();
        //繪制大圓中心文字?jǐn)?shù)字
        if (!TextUtils.isEmpty(mCenterText)) {
            mPaint.setColor(Color.BLACK);

            mPaint.setTextSize(textSizeBigCount);
            mPaint.setTextAlign(Paint.Align.CENTER);
            canvas.drawText("" + mCount, cx, cy - paddingTotal, mPaint);
            mPaint.setTextSize(textSizeBigCircle2);
            String text = mCenterText;
            //只有一個(gè)數(shù)據(jù)的時(shí)候最楷,中間文字為數(shù)據(jù)類型標(biāo)簽整份,不是傳進(jìn)來的mCenterText
            if (mDataSet.size() == 1)
                text = mDataSet.get(0).label;
            canvas.drawText(text, cx, cy + textSizeBigCircle2, mPaint);
        }
        // 底部繪制 小圓圈待错,及l(fā)abel
        if (mDataSet.size() > 2) {
            float scx, scy;
            float sdif = singleItemWidth;

            //最左邊到第一個(gè)item的距離(留白)
            float sw = (width - mDataSet.size() * sdif) / 2;
            //第一個(gè)小圓的圓心
            scy = padding + radius * 2 + paddingBottomCircle + sradius;
            scx = sw + sdif / 2;
            //由于外部限制,這里最多只有6個(gè)數(shù)據(jù)烈评,所以沒做多行小圓 的情況處理
            //需求也沒有大量數(shù)據(jù)項(xiàng)的情況火俄,所以其他情況讀者自行處理
            for (int i = 0; i < mDataSet.size(); i++) {
                Entry e = mDataSet.get(i);
                mPaint.setColor(e.color);
                canvas.drawCircle(scx, scy, sradius, mPaint);
                mPaint.setColor(Color.WHITE);
                mPaint.setTextSize(textSizeSmallCount);
                canvas.drawText("" + e.value, scx, scy + textSizeSmallCount * 1 / 3, mPaint);
                canvas.save();

                mTextPain.setTextSize(textSizeLabel);
                mTextPain.setTextAlign(Paint.Align.CENTER);
                mTextPain.setColor(0xFF5F5F5F);
                //getWidth()表示繪制多寬后換行
                int end = e.label.length();

                //繪制的文字 色設(shè)置固定寬度并自動(dòng)換行,最多顯示兩行
                StaticLayout sl = null;
                Class clazz = null;
                try {
                    clazz = Class.forName("android.text.StaticLayout");
                } catch (ClassNotFoundException e1) {
                    e1.printStackTrace();
                }
                Constructor con = null;
                StaticLayout tmp = null;
                try {
                    con = clazz.getConstructor(CharSequence.class, int.class, int.class, TextPaint.class, int.class,
                            Layout.Alignment.class, TextDirectionHeuristic.class, float.class, float.class, boolean.class,
                            TextUtils.TruncateAt.class, int.class, int.class);
                } catch (NoSuchMethodException e1) {
                    e1.printStackTrace();
                }

                try {
                    tmp = (StaticLayout) con.newInstance("" + e.label, 0, end, mTextPain, (int) sdif - 1, Layout.Alignment.ALIGN_NORMAL, TextDirectionHeuristics.FIRSTSTRONG_LTR, 1.0f, 0.0f, true, TextUtils.TruncateAt.MIDDLE, (int) (sdif - 3 * sradius), 2);
                } catch (InstantiationException e1) {
                    e1.printStackTrace();
                } catch (IllegalAccessException e1) {
                    e1.printStackTrace();
                } catch (InvocationTargetException e1) {
                    e1.printStackTrace();
                }
                sl = tmp;

//                StaticLayout sl = new StaticLayout(""+e.label, 0, end, mTextPain, (int)sdif - 1, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true, TextUtils.TruncateAt.MIDDLE, (int)(sdif - 3 * sradius));
                //從0,0開始繪制
                canvas.translate(scx, scy + sradius + paddingTotal);
                sl.draw(canvas);
                canvas.restore();
//                canvas.drawText(""+e.label,scx,scy+sradius*2+paddingTotal,mPaint);
                scx += sdif;
            }
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //這里沒有調(diào)用父類讲冠,因?yàn)槟J(rèn)的只是調(diào)用了setMeasuredDimension 方法瓜客,下面我們自己調(diào)用
//        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int minheight = (int) (padding + radius * 2 + padding);
        if (mDataSet.size() > 2) {
            //加上小面小圓+小圓label文字 + 留白的高度(粗略使用7倍小圓半徑),這里是粗略計(jì)算竿开,具體自行調(diào)節(jié)
            minheight += (sradius * 7);
        }

        setMeasuredDimension(
                Math.max(getSuggestedMinimumWidth(),
                        resolveSize(width,
                                widthMeasureSpec)),
                Math.max(getSuggestedMinimumHeight(),
                        resolveSize(minheight,
                                heightMeasureSpec)));
    }

    float convertDpToPixel(float dp) {

        return getResources().getDisplayMetrics().density * dp;

    }

    public static class Entry implements Comparable {
        public String label;
        public int value;
        public float angle;
        public int color;

        public Entry(String label, int value) {
            this.label = label;
            this.value = value;
        }

        @Override
        public int compareTo(@NonNull Object o) {
            Entry e = (Entry) o;
            if (value > e.value)
                return -1;
            if (value < e.value)
                return 1;
            return 0;
        }
    }
}

使用

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.philos.piechartdemo.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#15212121"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#FFFFFF"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawableLeft="@mipmap/ic_launcher"
                android:drawablePadding="8dp"
                android:gravity="center_vertical"
                android:padding="8dp"
                android:text="單個(gè)圓中間顯示名字和數(shù)量"
                android:textSize="16dp" />

            <com.example.philos.piechartdemo.PieChart
                android:id="@+id/pie_chart"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:background="#FFFFFF"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawableLeft="@mipmap/ic_launcher"
                android:drawablePadding="8dp"
                android:gravity="center_vertical"
                android:padding="8dp"
                android:text="兩個(gè)顯示橫線和名稱"
                android:textSize="16dp" />

            <com.example.philos.piechartdemo.PieChart
                android:id="@+id/pie_chart1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:background="#FFFFFF"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawableLeft="@mipmap/ic_launcher"
                android:drawablePadding="8dp"
                android:gravity="center_vertical"
                android:padding="8dp"
                android:text="兩個(gè)顯示橫線和名稱"
                android:textSize="16dp" />

            <com.example.philos.piechartdemo.PieChart
                android:id="@+id/pie_chart12"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:background="#FFFFFF"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawableLeft="@mipmap/ic_launcher"
                android:drawablePadding="8dp"
                android:gravity="center_vertical"
                android:padding="8dp"
                android:text="超過3個(gè)顯示小圓"
                android:textSize="16dp" />

            <com.example.philos.piechartdemo.PieChart
                android:id="@+id/pie_chart2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:background="#FFFFFF"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawableLeft="@mipmap/ic_launcher"
                android:drawablePadding="8dp"
                android:gravity="center_vertical"
                android:padding="8dp"
                android:text="最多6項(xiàng)"
                android:textSize="16dp" />

            <com.example.philos.piechartdemo.PieChart
                android:id="@+id/pie_chart3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </LinearLayout>
</ScrollView>
public class MainActivity extends AppCompatActivity {

    private PieChart mPieChart;
    private PieChart mPieChart1;
    private PieChart mPieChart12;
    private PieChart mPieChart2;
    private PieChart mPieChart3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mPieChart = (PieChart) findViewById(R.id.pie_chart);
        mPieChart1 = (PieChart) findViewById(R.id.pie_chart1);
        mPieChart12 = (PieChart) findViewById(R.id.pie_chart12);
        mPieChart2 = (PieChart) findViewById(R.id.pie_chart2);
        mPieChart3 = (PieChart) findViewById(R.id.pie_chart3);

        CompanyInfo companyInfo = new CompanyInfo(20, 0, 0, 0, 0, 0);
        ArrayList tmp = createPieChart(companyInfo);
        mPieChart.setData(tmp, "總共有");

        CompanyInfo companyInfo1 = new CompanyInfo(450, 3, 0, 0, 0, 0);
        ArrayList tmp1 = createPieChart(companyInfo1);
        mPieChart1.setData(tmp1, "總共有");

        CompanyInfo companyInfo12 = new CompanyInfo(370, 0, 0, 600, 0, 0);
        ArrayList tmp12 = createPieChart(companyInfo12);
        mPieChart12.setData(tmp12, "總共有");

        CompanyInfo companyInfo2 = new CompanyInfo(0, 0, 0, 50, 200, 10);
        ArrayList tmp2 = createPieChart(companyInfo2);
        mPieChart2.setData(tmp2, "總共有");

        CompanyInfo companyInfo3 = new CompanyInfo(15000, 10, 190, 7, 210, 80);
        ArrayList tmp3 = createPieChart(companyInfo3);
        mPieChart3.setData(tmp3, "總共有");
    }

    private ArrayList createPieChart(CompanyInfo companyInfo) {
        ArrayList tmp = new ArrayList();
        int count = 0;
        if(companyInfo.trademarks_count > 0) {
            count += companyInfo.trademarks_count;
            tmp.add(new PieChart.Entry("商標(biāo)",companyInfo.trademarks_count));//trademark
        }
        if(companyInfo.domains_count > 0) {
            count += companyInfo.domains_count;
            tmp.add(new PieChart.Entry("域名",companyInfo.domains_count));//trademark
        }
        if(companyInfo.patents_count > 0) {
            count += companyInfo.patents_count;
            tmp.add(new PieChart.Entry("專利",companyInfo.patents_count));//trademark
        }
        if(companyInfo.soft_count > 0) {
            count += companyInfo.soft_count;
            tmp.add(new PieChart.Entry("軟件著作權(quán)",companyInfo.soft_count));//trademark
        }
        if(companyInfo.original_count > 0) {
            count += companyInfo.original_count;
            tmp.add(new PieChart.Entry("原創(chuàng)著作權(quán)公司資質(zhì)認(rèn)證",companyInfo.original_count));//trademark
        }
        if(companyInfo.certificate_count > 0) {
            count += companyInfo.certificate_count;
            tmp.add(new PieChart.Entry("公司資質(zhì)認(rèn)證",companyInfo.certificate_count));//trademark
        }
        return tmp;
    }

    class CompanyInfo {
        public int trademarks_count;
        public int domains_count;
        public int patents_count;
        public int soft_count;
        public int original_count;
        public int certificate_count;

        public CompanyInfo(int trademarks_count, int domains_count, int patents_count, int soft_count, int original_count, int certificate_count) {
            this.trademarks_count = trademarks_count;
            this.domains_count = domains_count;
            this.patents_count = patents_count;
            this.soft_count = soft_count;
            this.original_count = original_count;
            this.certificate_count = certificate_count;
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谱仪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子否彩,更是在濱河造成了極大的恐慌疯攒,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件列荔,死亡現(xiàn)場離奇詭異敬尺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贴浙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門砂吞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人崎溃,你說我怎么就攤上這事蜻直。” “怎么了笨奠?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵袭蝗,是天一觀的道長。 經(jīng)常有香客問我般婆,道長到腥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任蔚袍,我火速辦了婚禮乡范,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啤咽。我一直安慰自己晋辆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布宇整。 她就那樣靜靜地躺著瓶佳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鳞青。 梳的紋絲不亂的頭發(fā)上霸饲,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天为朋,我揣著相機(jī)與錄音,去河邊找鬼厚脉。 笑死习寸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的傻工。 我是一名探鬼主播霞溪,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼中捆!你這毒婦竟也來了鸯匹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤轨香,失蹤者是張志新(化名)和其女友劉穎忽你,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臂容,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡科雳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脓杉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糟秘。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖球散,靈堂內(nèi)的尸體忽然破棺而出尿赚,到底是詐尸還是另有隱情,我是刑警寧澤蕉堰,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布凌净,位于F島的核電站,受9級(jí)特大地震影響屋讶,放射性物質(zhì)發(fā)生泄漏冰寻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一皿渗、第九天 我趴在偏房一處隱蔽的房頂上張望斩芭。 院中可真熱鬧,春花似錦乐疆、人聲如沸划乖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琴庵。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間细卧,已是汗流浹背尉桩。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贪庙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓翰苫,卻偏偏與公主長得像止邮,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奏窑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容