簡(jiǎn)單的一個(gè)比例分布條

做一個(gè)統(tǒng)計(jì)分布條昙衅,比如每個(gè)月的支出分布情況,某一類盈利的收入類型粘招。
這里沒(méi)有采用柱狀圖、餅圖的做法偎球,所以想要柱狀圖或者餅圖的可以不用往下看了洒扎,推薦一個(gè)圖表框架MPAndroidChart
,可以實(shí)現(xiàn)柱狀圖衰絮、餅圖等圖表袍冷。

效果圖

20190625120649.png

實(shí)現(xiàn)原理

原理很簡(jiǎn)單,就是繼承一個(gè)LinearLayout猫牡,通過(guò)addView的方式動(dòng)態(tài)去添加View胡诗,每一個(gè)支出類型就是一個(gè)TextView。采用動(dòng)態(tài)添加的原因是淌友,因?yàn)槊總€(gè)占比大小是不一樣的煌恢,我們需要去計(jì)算出并且設(shè)置TextView的寬度。
CoinPosition 封裝的一個(gè)比例分布類震庭,是該控件的一個(gè)靜態(tài)內(nèi)部類瑰抵。

public static class CoinPosition{
        //每個(gè)Item的占比以及名字
        private String coinName;
        private double percent;

        public CoinPosition(String coinName, double percent) {
            this.coinName = coinName;
            this.percent = percent;
        }

        public String getCoinName() {
            return coinName;
        }

        public void setCoinName(String coinName) {
            this.coinName = coinName;
        }

        public double getPercent() {
            return percent;
        }

        public void setPercent(double percent) {
            this.percent = percent;
        }
    }

核心代碼:

 private View getChildView(CoinPosition coinPosition,int index){
        LinearLayout.LayoutParams params;
        if(index == data.size()-1){//1
            params= new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);//2
        }else {
            params= new LinearLayout.LayoutParams((int) (parentWidth * coinPosition.percent),LayoutParams.MATCH_PARENT);//3
        }
        TextView textView=new TextView(getContext());
        textView.setLayoutParams(params);
        textView.setText(coinPosition.coinName);
        textView.setGravity(Gravity.CENTER);
        textView.setTextSize(12);
        textView.setTextColor(Color.parseColor("#FFFFFF"));
        if(index<colorRes.length){
            textView.setBackgroundColor(colorRes[index]);
        }
        return textView;
    }

getChildView去獲得子View的實(shí)例,并且將相應(yīng)的名字器联、控件寬度已經(jīng)背景顏色配置上去二汛。
注釋1中判斷索引位置婿崭,注釋3在設(shè)定子View寬度的時(shí)候是有丟失精度取整的,所以在注釋1中需要判斷當(dāng)前索引是否為數(shù)據(jù)的最后一個(gè)习贫,最后一個(gè)不用注釋3的方法得到寬度逛球,否則的話會(huì)出現(xiàn)控件會(huì)出現(xiàn)空白,直接傳入LayoutParams.MATCH_PARENT苫昌,利用完剩余的父布局寬度颤绕。

完整的代碼:

package com.beidd.digiccy.myapplication;

import android.content.Context;
import android.graphics.Color;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Hugh.HYS
 * @date 2019/6/24
 */
public class DistributionLine extends LinearLayout {

    private List<CoinPosition> data=new ArrayList<>();
    private LayoutInflater layoutInflater;
    private int parentWidth;
    private int[] colorRes=new int[6];

    private Handler handler;

    public List<CoinPosition> getData() {
        return data;
    }

    public void setData(List<CoinPosition> data) {

        if(data.size()==0){
            return;
        }
        this.data.clear();
        this.data.addAll(data);
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                updateView();
            }
        },500);

    }

    public DistributionLine(Context context) {
        super(context);
        initConfig();
    }

    public DistributionLine(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initConfig();
    }

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

    public DistributionLine(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        initConfig();
    }

    private void initConfig(){
        setOrientation(LinearLayout.HORIZONTAL);
        if(handler==null){
            handler=new Handler();
        }
        if(layoutInflater==null){
            layoutInflater= LayoutInflater.from(getContext());
        }
        //初始化顏色配置
        colorRes[0]= Color.parseColor("#DC143C");
        colorRes[1]= Color.parseColor("#4B0082");
        colorRes[2]= Color.parseColor("#FF0000");
        colorRes[3]= Color.parseColor("#00FFFF");
        colorRes[4]= Color.parseColor("#2E8B57");
        colorRes[5]= Color.parseColor("#DAA520");
    }

    private void updateView(){
        removeAllViews();
        parentWidth=getMeasuredWidth();
        for (int i=0;i<data.size();i++){
           addView(getChildView(data.get(i),i));
        }

    }

    private View getChildView(CoinPosition coinPosition,int index){
        LinearLayout.LayoutParams params;
        if(index == data.size()-1){
            params= new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
        }else {
            params= new LinearLayout.LayoutParams((int) (parentWidth * coinPosition.percent),LayoutParams.MATCH_PARENT);
        }
        TextView textView=new TextView(getContext());
        textView.setLayoutParams(params);
        textView.setText(coinPosition.coinName);
        textView.setGravity(Gravity.CENTER);
        textView.setTextSize(12);
        textView.setTextColor(Color.parseColor("#FFFFFF"));
        if(index<colorRes.length){
            textView.setBackgroundColor(colorRes[index]);
        }
        return textView;
    }

    public static class CoinPosition{
        //每個(gè)Item的占比以及名字
        private String coinName;
        private double percent;

        public CoinPosition(String coinName, double percent) {
            this.coinName = coinName;
            this.percent = percent;
        }

        public String getCoinName() {
            return coinName;
        }

        public void setCoinName(String coinName) {
            this.coinName = coinName;
        }

        public double getPercent() {
            return percent;
        }

        public void setPercent(double percent) {
            this.percent = percent;
        }
    }

}

測(cè)試:

package com.beidd.digiccy.myapplication;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Hugh.HYS
 * @date 2019/4/3
 */
public class TestActivity extends AppCompatActivity {

    private DistributionLine distributionLine;
    final List<DistributionLine.CoinPosition> data=new ArrayList<>();


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act);
        distributionLine=findViewById(R.id.dis);
        data.clear();
        data.add(new DistributionLine.CoinPosition("投資",0.3));
        data.add(new DistributionLine.CoinPosition("衣服",0.2));
        data.add(new DistributionLine.CoinPosition("吃喝",0.2));
        data.add(new DistributionLine.CoinPosition("玩樂(lè)",0.1));
        data.add(new DistributionLine.CoinPosition("出行",0.1));
        data.add(new DistributionLine.CoinPosition("其它",0.1));
        distributionLine.setData(data);


    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市祟身,隨后出現(xiàn)的幾起案子奥务,更是在濱河造成了極大的恐慌,老刑警劉巖袜硫,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氯葬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡婉陷,警方通過(guò)查閱死者的電腦和手機(jī)帚称,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秽澳,“玉大人闯睹,你說(shuō)我怎么就攤上這事〉I瘢” “怎么了楼吃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)妄讯。 經(jīng)常有香客問(wèn)我孩锡,道長(zhǎng),這世上最難降的妖魔是什么亥贸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任躬窜,我火速辦了婚禮,結(jié)果婚禮上炕置,老公的妹妹穿的比我還像新娘斩披。我一直安慰自己,他們只是感情好讹俊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著煌抒,像睡著了一般仍劈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寡壮,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天贩疙,我揣著相機(jī)與錄音讹弯,去河邊找鬼。 笑死这溅,一個(gè)胖子當(dāng)著我的面吹牛组民,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悲靴,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼臭胜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了癞尚?” 一聲冷哼從身側(cè)響起耸三,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浇揩,沒(méi)想到半個(gè)月后仪壮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胳徽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年积锅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片养盗。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缚陷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出爪瓜,到底是詐尸還是另有隱情蹬跃,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布铆铆,位于F島的核電站蝶缀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏薄货。R本人自食惡果不足惜翁都,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谅猾。 院中可真熱鬧柄慰,春花似錦、人聲如沸税娜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敬矩。三九已至概行,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弧岳,已是汗流浹背凳忙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工业踏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涧卵。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓勤家,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親柳恐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子伐脖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • 昨晚夢(mèng)見(jiàn)自己快要死了,早晨竟然睡過(guò)了頭胎撤,我不知道是鬧鐘音量調(diào)小了晓殊,還是真的太累了,可是我分明不覺(jué)得累伤提。也許是我貪念...
    Moon_star閱讀 426評(píng)論 0 9
  • 白肌巫俺,黑毛 骯臟的馬桶 扭曲的體位 噴泉的血液 隨水涌動(dòng) 癸水爆炸滿臉 滑落滑落再滑落 《翻滾》 吃飯 將刀子插進(jìn)...
    著邊閱讀 166評(píng)論 0 1
  • 背景:看完小豬佩奇那集兔子去見(jiàn)女王,睡前邊給娃穿睡衣邊瞎聊 娃媽:豆豆穿上這個(gè)王冠睡衣是男王還是女王肿男? 娃:是小汽車王
    YUANDOU閱讀 110評(píng)論 0 0
  • 早晨在陽(yáng)臺(tái)上做拉伸運(yùn)動(dòng)的時(shí)候舶沛,順著窗戶看到兩位掃地工嘹承,一男一女,我估計(jì)應(yīng)該是夫妻如庭,看著他們左手拿著掃帚叹卷,右手快速地...
    浪跡天涯的咖啡閱讀 1,261評(píng)論 13 50