MPAndroidChart的簡(jiǎn)單使用以及心得

1.MPAndroidChart簡(jiǎn)介

  • Github:https://github.com/PhilJay/MPAndroidChart
  • A powerful Android chart view / graph view library, supporting line- bar- pie- radar- bubble- and candlestick charts as well as scaling, dragging and animations.
  • Chart動(dòng)畫.gif

2.MPAndroidChart之折線圖(LineChart)

1.效果圖

折線圖.png

2. 基本組成元素

  • x軸(最大/最小值 顏色 高寬等)
  • Y軸(最大/最小值 顏色 高寬等)
  • 不及格線(位置 顏色 高寬等)
  • 優(yōu)秀線(位置 顏色 高寬等)
  • 下標(biāo)文字(年度總結(jié)報(bào)告)
  • 區(qū)域顏色(黃色)
  • 數(shù)據(jù)(x,y)

3.基本實(shí)現(xiàn)

  • xml文件
<com.github.mikephil.charting.charts.LineChart
        android:id="@+id/mLineChar"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

  • 折線圖展示java代碼
    基本設(shè)置
mLineChar = (LineChart) findViewById(R.id.mLineChar);
        //設(shè)置手勢(shì)滑動(dòng)事件
        mLineChar.setOnChartGestureListener(this);
        //設(shè)置數(shù)值選擇監(jiān)聽
        mLineChar.setOnChartValueSelectedListener(this);
        //后臺(tái)繪制
        mLineChar.setDrawGridBackground(false);
        //設(shè)置描述文本
        mLineChar.getDescription().setEnabled(false);
        //設(shè)置支持觸控手勢(shì)
        mLineChar.setTouchEnabled(true);
        //設(shè)置縮放
        mLineChar.setDragEnabled(true);
        //設(shè)置推動(dòng)
        mLineChar.setScaleEnabled(true);
        //如果禁用,擴(kuò)展可以在x軸和y軸分別完成
        mLineChar.setPinchZoom(true);

填充數(shù)據(jù)

 //這里我模擬一些數(shù)據(jù)
        ArrayList<Entry> values = new ArrayList<Entry>();
        values.add(new Entry(5, 50));
        values.add(new Entry(10, 66));
        values.add(new Entry(15, 120));
        values.add(new Entry(20, 30));
        values.add(new Entry(35, 10));
        values.add(new Entry(40, 110));
        values.add(new Entry(45, 30));
        values.add(new Entry(50, 160));
        values.add(new Entry(100, 30));

        //設(shè)置數(shù)據(jù)
        setData(values);
        //默認(rèn)動(dòng)畫
        mLineChar.animateX(2500);
        //刷新
        mChart.invalidate();
        // 得到這個(gè)文字
        Legend l = mLineChar.getLegend();
        // 修改文字 ...
        l.setForm(Legend.LegendForm.LINE);
        //傳遞數(shù)據(jù)集
    private void setData(ArrayList<Entry> values) {
        if (mLineChar.getData() != null && mLineChar.getData().getDataSetCount() > 0) {
            set1 = (LineDataSet) mLineChar.getData().getDataSetByIndex(0);
            set1.setValues(values);
            mLineChar.getData().notifyDataChanged();
            mLineChar.notifyDataSetChanged();
        } else {
            // 創(chuàng)建一個(gè)數(shù)據(jù)集,并給它一個(gè)類型
            set1 = new LineDataSet(values, "年度總結(jié)報(bào)告");

            // 在這里設(shè)置線
            set1.enableDashedLine(10f, 5f, 0f);
            set1.enableDashedHighlightLine(10f, 5f, 0f);
            set1.setColor(Color.BLACK);
            set1.setCircleColor(Color.BLACK);
            set1.setLineWidth(1f);
            set1.setCircleRadius(3f);
            set1.setDrawCircleHole(false);
            set1.setValueTextSize(9f);
            set1.setDrawFilled(true);
            set1.setFormLineWidth(1f);
            set1.setFormLineDashEffect(new DashPathEffect(new float[]{10f, 5f}, 0f));
            set1.setFormSize(15.f);

            if (Utils.getSDKInt() >= 18) {
                // 填充背景只支持18以上
                //Drawable drawable = ContextCompat.getDrawable(this, R.mipmap.ic_launcher);
                //set1.setFillDrawable(drawable);
                set1.setFillColor(Color.YELLOW);
            } else {
                set1.setFillColor(Color.BLACK);
            }
            ArrayList<ILineDataSet> dataSets = new ArrayList<ILineDataSet>();
            //添加數(shù)據(jù)集
            dataSets.add(set1);

            //創(chuàng)建一個(gè)數(shù)據(jù)集的數(shù)據(jù)對(duì)象
            LineData data = new LineData(dataSets);

            //誰(shuí)知數(shù)據(jù)
            mLineChar.setData(data);
        }
    }
  • 折線圖效果
    1.是否填充
List<ILineDataSet> setsFilled = mLineChar.getData().getDataSets();
    for (ILineDataSet iSet : setsFilled) {
        LineDataSet set = (LineDataSet) iSet;
        if (set.isDrawFilledEnabled())
            set.setDrawFilled(false);
        else
            set.setDrawFilled(true);
    }
    mLineChar.invalidate();
是否填充.gif

2.立方切換

List<ILineDataSet> setsCubic = mLineChar.getData().getDataSets();
    for (ILineDataSet iSet : setsCubic) {
        LineDataSet set = (LineDataSet) iSet;
        set.setMode(set.getMode() == LineDataSet.Mode.CUBIC_BEZIER
                ? LineDataSet.Mode.LINEAR
                : LineDataSet.Mode.CUBIC_BEZIER);
    }
    mLineChar.invalidate();
立方切換.gif

3.MPAndroidChart之條形圖線圖(BarChart)

1.效果圖

條形圖.png

2.基本實(shí)現(xiàn)

  • xml文件
<com.github.mikephil.charting.charts.BarChart
        android:id="@+id/mBarChart"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>
  • 條形圖展示代碼
        //條形圖
        mBarChart = (BarChart) findViewById(R.id.mBarChart);
        //設(shè)置表格上的點(diǎn)索绪,被點(diǎn)擊的時(shí)候鹤啡,的回調(diào)函數(shù)
        mBarChart.setOnChartValueSelectedListener(this);
        mBarChart.setDrawBarShadow(false);
        mBarChart.setDrawValueAboveBar(true);
        mBarChart.getDescription().setEnabled(false);
        // 如果60多個(gè)條目顯示在圖表,drawn沒(méi)有值
        mBarChart.setMaxVisibleValueCount(60);
        // 擴(kuò)展現(xiàn)在只能分別在x軸和y軸
        mBarChart.setPinchZoom(false);
        //是否顯示表格顏色
        mBarChart.setDrawGridBackground(false);
        XAxis xAxis = mBarChart.getXAxis();
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setDrawGridLines(false);
        // 只有1天的時(shí)間間隔
        xAxis.setGranularity(1f);
        xAxis.setLabelCount(7);
        xAxis.setAxisMaximum(50f);
        xAxis.setAxisMinimum(0f);
        xAxis.setValueFormatter(xAxisFormatter);

        YAxis leftAxis = mBarChart.getAxisLeft();
        leftAxis.setLabelCount(8, false);
        leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
        leftAxis.setSpaceTop(15f);
        //這個(gè)替換setStartAtZero(true)
        leftAxis.setAxisMinimum(0f);
        leftAxis.setAxisMaximum(50f);
        YAxis rightAxis = mBarChart.getAxisRight();
        rightAxis.setDrawGridLines(false);
        rightAxis.setLabelCount(8, false);
        rightAxis.setSpaceTop(15f);
        rightAxis.setAxisMinimum(0f);
        rightAxis.setAxisMaximum(50f);

    //設(shè)置數(shù)據(jù)
      private void setData(ArrayList yVals1) {
        float start = 1f;
        BarDataSet set1;
        if (mBarChart.getData() != null &&
                mBarChart.getData().getDataSetCount() > 0) {
            set1 = (BarDataSet) mBarChart.getData().getDataSetByIndex(0);
            set1.setValues(yVals1);
            mBarChart.getData().notifyDataChanged();
            mBarChart.notifyDataSetChanged();
        } else {
            set1 = new BarDataSet(yVals1, "2017年工資漲幅");
            //設(shè)置有四種顏色
            set1.setColors(ColorTemplate.MATERIAL_COLORS);
            ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
            dataSets.add(set1);
            BarData data = new BarData(dataSets);
            data.setValueTextSize(10f);
            data.setBarWidth(0.9f);
            //設(shè)置數(shù)據(jù)
            mBarChart.setData(data);
        }
    }
  • 條形圖效果展示
    1.顯示頂點(diǎn)值
  for (IDataSet set : mBarChart.getData().getDataSets()){
       set.setDrawValues(!set.isDrawValuesEnabled());
      }
  mBarChart.invalidate();
顯示頂點(diǎn)值.gif

2.XY軸動(dòng)畫

mBarChart.animateXY(3000, 3000);
XY軸動(dòng)畫.gif

3.顯示邊框

for (IBarDataSet set : mBarChart.getData().getDataSets())
                    ((BarDataSet) set)
                            .setBarBorderWidth(set.getBarBorderWidth() == 1.f ? 0.f
                                    : 1.f);
                mBarChart.invalidate();
顯示邊框.gif

4.MPAndroidChart之餅狀圖(PieChart)

1.效果圖

餅狀圖.png

2.基本實(shí)現(xiàn)

  • xml文件
<com.github.mikephil.charting.charts.PieChart
        android:id="@+id/mPieChart"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>
  • 餅狀圖展示代碼
      //餅狀圖
        mPieChart = (PieChart) findViewById(R.id.mPieChart);
        mPieChart.setUsePercentValues(true);
        mPieChart.getDescription().setEnabled(false);
        mPieChart.setExtraOffsets(5, 10, 5, 5);

        mPieChart.setDragDecelerationFrictionCoef(0.95f);
        //設(shè)置中間文件
        mPieChart.setCenterText(generateCenterSpannableText());

        mPieChart.setDrawHoleEnabled(true);
        mPieChart.setHoleColor(Color.WHITE);

        mPieChart.setTransparentCircleColor(Color.WHITE);
        mPieChart.setTransparentCircleAlpha(110);

        mPieChart.setHoleRadius(58f);
        mPieChart.setTransparentCircleRadius(61f);

        mPieChart.setDrawCenterText(true);

        mPieChart.setRotationAngle(0);
        // 觸摸旋轉(zhuǎn)
        mPieChart.setRotationEnabled(true);
        mPieChart.setHighlightPerTapEnabled(true);

        //變化監(jiān)聽
        mPieChart.setOnChartValueSelectedListener(this);
        //模擬數(shù)據(jù)
        ArrayList<PieEntry> entries = new ArrayList<PieEntry>();
        entries.add(new PieEntry(40, "優(yōu)秀"));
        entries.add(new PieEntry(20, "滿分"));
        entries.add(new PieEntry(30, "及格"));
        entries.add(new PieEntry(10, "不及格"));

        //設(shè)置數(shù)據(jù)
        setData(entries);
        mPieChart.animateY(1400,                     Easing.EasingOption.EaseInOutQuad);

        Legend l = mPieChart.getLegend();
        l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
        l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
        l.setOrientation(Legend.LegendOrientation.VERTICAL);
        l.setDrawInside(false);
        l.setXEntrySpace(7f);
        l.setYEntrySpace(0f);
        l.setYOffset(0f);

        // 輸入標(biāo)簽樣式
        mPieChart.setEntryLabelColor(Color.WHITE);
        mPieChart.setEntryLabelTextSize(12f);
        //設(shè)置數(shù)據(jù)
        private void setData(ArrayList<PieEntry> entries) {
        PieDataSet dataSet = new PieDataSet(entries, "三年級(jí)一班");
        dataSet.setSliceSpace(3f);
        dataSet.setSelectionShift(5f);

        //數(shù)據(jù)和顏色
        ArrayList<Integer> colors = new ArrayList<Integer>();
        for (int c : ColorTemplate.VORDIPLOM_COLORS)
            colors.add(c);
        for (int c : ColorTemplate.JOYFUL_COLORS)
            colors.add(c);
        for (int c : ColorTemplate.COLORFUL_COLORS)
            colors.add(c);
        for (int c : ColorTemplate.LIBERTY_COLORS)
            colors.add(c);
        for (int c : ColorTemplate.PASTEL_COLORS)
            colors.add(c);
        colors.add(ColorTemplate.getHoloBlue());
        dataSet.setColors(colors);
        PieData data = new PieData(dataSet);
        data.setValueFormatter(new PercentFormatter());
        data.setValueTextSize(11f);
        data.setValueTextColor(Color.WHITE);
        mPieChart.setData(data);
        mPieChart.highlightValues(null);
        //刷新
        mPieChart.invalidate();
    }
  • 餅狀圖效果展示
    1.顯示百分比
      for (IDataSet<?> set : mPieChart.getData().getDataSets()){
               set.setDrawValues(!set.isDrawValuesEnabled());
      }
               mPieChart.invalidate();
顯示百分比.gif

2.xy軸動(dòng)畫

mPieChart.animateXY(1400, 1400);
餅狀圖XY軸動(dòng)畫.gif

3.旋轉(zhuǎn)動(dòng)畫

mPieChart.spin(1000, mPieChart.getRotationAngle(), mPieChart.getRotationAngle() + 360, Easing.EasingOption
                        .EaseInCubic);
旋轉(zhuǎn)動(dòng)畫.gif

5.小結(jié)

1.MPAndeordChart的核心功能:

  • 支持x,y軸縮放
  • 支持拖拽
  • 支持手指滑動(dòng)
  • 支持高亮顯示
  • 支持保存圖表到文件中
  • 支持從文件(txt)中讀取數(shù)據(jù)
  • 預(yù)先定義顏色模板
  • 自動(dòng)生成標(biāo)注
  • 支持自定義x,y軸的顯示標(biāo)簽
  • 支持x,y軸動(dòng)畫
  • 支持x,y軸設(shè)置最大值和附加信息
  • 支持自定義字體琐旁,顏色,背景猜绣,手勢(shì)灰殴,虛線等

2.優(yōu)勢(shì)

  • 使用于Android和IOS
  • 樣式以及動(dòng)畫效果基本上滿足開發(fā)各類應(yīng)用的圖表展示
  • 使用方便簡(jiǎn)單,API非常詳細(xì)途事,開發(fā)快捷

3.最后附上兩位大神的總結(jié)

最后感謝您的閱讀验懊,有機(jī)會(huì)一起探討!

thanks.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尸变,一起剝皮案震驚了整個(gè)濱河市义图,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌召烂,老刑警劉巖碱工,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異奏夫,居然都是意外死亡怕篷,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門酗昼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)廊谓,“玉大人,你說(shuō)我怎么就攤上這事麻削≌舯裕” “怎么了春弥?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)叠荠。 經(jīng)常有香客問(wèn)我匿沛,道長(zhǎng),這世上最難降的妖魔是什么榛鼎? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任逃呼,我火速辦了婚禮,結(jié)果婚禮上者娱,老公的妹妹穿的比我還像新娘抡笼。我一直安慰自己,他們只是感情好肺然,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布蔫缸。 她就那樣靜靜地躺著腿准,像睡著了一般际起。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吐葱,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天街望,我揣著相機(jī)與錄音,去河邊找鬼弟跑。 笑死灾前,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的孟辑。 我是一名探鬼主播哎甲,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼饲嗽!你這毒婦竟也來(lái)了炭玫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤貌虾,失蹤者是張志新(化名)和其女友劉穎吞加,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尽狠,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衔憨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袄膏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片践图。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沉馆,靈堂內(nèi)的尸體忽然破棺而出码党,到底是詐尸還是另有隱情赫舒,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布闽瓢,位于F島的核電站接癌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扣讼。R本人自食惡果不足惜缺猛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望椭符。 院中可真熱鬧荔燎,春花似錦、人聲如沸销钝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蒸健。三九已至座享,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間似忧,已是汗流浹背渣叛。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盯捌,地道東北人淳衙。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像饺著,于是被迫代替她去往敵國(guó)和親箫攀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 1幼衰、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,982評(píng)論 3 119
  • 10.4號(hào)從深圳到珠海參加一位姐妹的婚禮靴跛。 真替這位姐妹感到高興,終于找到了好的歸宿塑顺。我和這位姐妹是同村的汤求,她讀書...
    戚華桃閱讀 131評(píng)論 1 0
  • 雨下著 我哭了 小雨懂得人情 好不容易相同的調(diào)調(diào) 一樣斜著漂 一次次入侵 一次次失敗 魚傷了尾鰭 小小的戰(zhàn)栗 雨絮...
    琴歌素簡(jiǎn)閱讀 199評(píng)論 0 1
  • 忙碌的一天。 早上安排了十點(diǎn)的客戶會(huì)議严拒,所以并沒(méi)有趕去上班的匆忙扬绪。 悠哉悠哉地開著電動(dòng)去客戶公司,在客戶現(xiàn)場(chǎng)進(jìn)行了...
    GrandFarmer閱讀 106評(píng)論 0 0
  • 0 又到七月流火的季節(jié)裤唠。 每年的這個(gè)時(shí)候挤牛,全中國(guó)的千萬(wàn)學(xué)子們都在忙著一件事,升學(xué)种蘸。 升學(xué)考試是選拔性的墓赴,無(wú)論是幼升...
    八神蒼月閱讀 398評(píng)論 0 1