解析Android上強(qiáng)大的圖表庫(kù)MPAndroidChart

條形圖和線形圖的組合圖

一圖勝千文忱屑,純粹的數(shù)據(jù)枯燥蹬敲、無聊扼褪,讓人看不下去,改變一下形式粱栖,用圖表裝飾一下话浇,立馬有趣多了。既然有這樣的外部需求闹究,Android世界里肯定要有圖表庫(kù)才行幔崖,今天解析的就是其中最強(qiáng)大的一個(gè)MPAndroidChart。

GitHub地址:https://github.com/PhilJay/MPAndroidChart

核心功能

  • 支持以下圖表:
    • Line Chart(線圖)
    • Bar Chart(條形圖渣淤,又稱柱狀圖)
    • Combined Chart(組合圖:線性+條形)
    • Pie Chart(餅狀圖)
    • Scatter Chart(散點(diǎn)圖)
    • Bubble Chart(氣泡圖)
    • Stacked Bar Chart(堆積條形圖)
    • Candle Stick Chart(蠟燭圖)
    • Cubic Line Chart(立方擬合的折線圖)
    • Radar Chart(雷達(dá)圖)
    • Realtime Chart(實(shí)時(shí)折線圖)
    • Sinus Bar Chart(正弦柱狀圖)
  • 支持以下操作和設(shè)置:
    • 支持x赏寇,y軸縮放
    • 支持拖拽
    • 支持手指滑動(dòng)
    • 支持高亮顯示
    • 支持保存圖表到文件中
    • 支持從文件(txt)中讀取數(shù)據(jù)
    • 預(yù)先定義顏色模板
    • 自動(dòng)生成標(biāo)注
    • 支持自定義x,y軸的顯示標(biāo)簽
    • 支持x价认,y軸動(dòng)畫
    • 支持x嗅定,y軸設(shè)置最大值和附加信息
    • 支持自定義字體,顏色用踩,背景渠退,手勢(shì),虛線等

集成和使用

總共有四種方式集成脐彩,推薦直接用Gradle依賴

  1. 在project根目錄的build.gradle添加中央庫(kù)地址
allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}
  1. 在項(xiàng)目build.gradle中添加相關(guān)依賴:
dependencies {
    compile 'com.github.PhilJay:MPAndroidChart:v3.0.0-beta1'
}
  1. 在xml文件定義圖表類型碎乃,比如LineChart, BarChart, ScatterChart, CandleStickChart, PieChart, BubbleChart or RadarChart
<com.github.mikephil.charting.charts.LineChart
        android:id="@+id/chart1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/seekBar1" />
  1. 基礎(chǔ)設(shè)置
mChart = (LineChart) findViewById(R.id.chart1);
        mChart.setOnChartGestureListener(this);
        mChart.setOnChartValueSelectedListener(this);
        mChart.setDrawGridBackground(false);

        // no description text
        mChart.setDescription("");
        mChart.setNoDataTextDescription("You need to provide data for the chart.");

        // enable touch gestures
        mChart.setTouchEnabled(true);

        // enable scaling and dragging
        mChart.setDragEnabled(true);
        mChart.setScaleEnabled(true);
        // mChart.setScaleXEnabled(true);
        // mChart.setScaleYEnabled(true);

        // if disabled, scaling can be done on x- and y-axis separately
        mChart.setPinchZoom(true);

        // set an alternative background color
        // mChart.setBackgroundColor(Color.GRAY);

        // create a custom MarkerView (extend MarkerView) and specify the layout
        // to use for it
        MyMarkerView mv = new MyMarkerView(this, R.layout.custom_marker_view);

        // set the marker to the chart
        mChart.setMarkerView(mv);
  1. 設(shè)置數(shù)據(jù)源:各種圖表的數(shù)據(jù)不太一致,對(duì)于LineChart而言惠奸,就是一系列的(x,y)
/**
     * 設(shè)置模擬數(shù)據(jù)
     * @param count 模擬的個(gè)數(shù)
     * @param range 數(shù)據(jù)的范圍
     */
    private void setData(int count, float range) {

        ArrayList<Entry> values = new ArrayList<Entry>();

        for (int i = 0; i < count; i++) {

            float val = (float) (Math.random() * range) + 3;
            values.add(new Entry(i, val));
        }

        LineDataSet set1;

        if (mChart.getData() != null &&
                mChart.getData().getDataSetCount() > 0) {
            set1 = (LineDataSet)mChart.getData().getDataSetByIndex(0);
            set1.setValues(values);
            mChart.getData().notifyDataChanged();
            mChart.notifyDataSetChanged();
        } else {
            // create a dataset and give it a type
            set1 = new LineDataSet(values, "DataSet 1");

            // set the line to be drawn like this "- - - - - -"
            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);

            if (Utils.getSDKInt() >= 18) {
                // fill drawable only supported on api level 18 and above
                Drawable drawable = ContextCompat.getDrawable(this, R.drawable.fade_red);
                set1.setFillDrawable(drawable);
            }
            else {
                set1.setFillColor(Color.BLACK);
            }

            ArrayList<ILineDataSet> dataSets = new ArrayList<ILineDataSet>();
            dataSets.add(set1); // add the datasets

            // create a data object with the datasets
            LineData data = new LineData(dataSets);

            // set data
            mChart.setData(data);
        }
    }

此處源碼梅誓,參考Demo中的LineChartActivity1

最后樣式如下:

線圖

Demo概覽

Demo提供32個(gè)樣例:

  1. Line Chart:演示一個(gè)簡(jiǎn)單的線圖
  2. Line Chart (Dual YAxis):演示一個(gè)有兩個(gè)Y軸線圖
  3. Bar Chart:演示一個(gè)柱狀圖
  4. Horizontal Bar Chart:演示水平柱狀圖,即X軸和Y軸反過來佛南。
  5. Combined Chart:演示 線圖梗掰、柱狀圖、蠟燭圖嗅回、氣泡圖 如何疊加在一起顯示
  6. Pie Chart:演示簡(jiǎn)易餅狀圖
  7. Pie Chart with value lines:演示帶數(shù)據(jù)線的餅狀圖
  8. Scatter Chart:演示了 圓點(diǎn)及穗、方點(diǎn)、斜線 這三種樣式的散點(diǎn)圖
  9. Bubble Chart: 演示了不同顏色的氣泡圖妈拌。
  10. Stacked Bar Chart: 演示了堆積條形圖
  11. Stacked Bar Chart Negative:演示了有負(fù)數(shù)數(shù)值的堆積條形圖
  12. Another Bar Chart:只在底部顯示值的柱狀圖拥坛。
  13. Multiple Lines Chart:3條線圖混合在一起,用顏色和實(shí)線尘分、虛線來區(qū)分
  14. Multiple Bars Chart:不同年份猜惋、不同公司的數(shù)據(jù)組成的柱狀圖
  15. Charts in ViewPager Fragments:結(jié)合ViewPager、Fragment培愁,透過左右滑動(dòng)查看不同的圖表著摔。
  16. BarChart inside ListView:柱狀圖如何嵌入在ListView中
  17. Multiple charts inside ListView:不同類型的圖表如何嵌入在ListView中
  18. Inverted Line Chart:演示(0,0)在左上角的線圖
  19. Candle Stick Chart: 演示蠟燭圖
  20. Cubic Line Chart:演示 立方擬合的折線圖
  21. Radar Chart:演示雷達(dá)圖
  22. Colored Line Chart:在不同背景色上演示同一張線圖
  23. Realtime Chart:實(shí)時(shí)產(chǎn)生數(shù)據(jù)定续,進(jìn)行演示谍咆。
  24. Dynamical data adding:實(shí)時(shí)產(chǎn)生數(shù)據(jù)集和數(shù)據(jù)禾锤,進(jìn)行演示。
  25. Performance Line Chart:用30000個(gè)數(shù)據(jù)來測(cè)試性能摹察。
  26. Sinus Bar Chart:演示正弦柱狀圖恩掷。
  27. Chart in ScrollView:演示如何把圖表放在ScrollView中。
  28. BarChart positive / negative:演示有負(fù)值的柱狀圖供嚎。
  29. Realm.io Database:演示如何從Realm數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)進(jìn)行展示(里面有9個(gè)案例)黄娘。
  30. Time Chart:演示時(shí)間圖。
  31. Filled LineChart:演示如何填滿兩條線圖中間的部分克滴。
  32. Half PieChart:演示一個(gè)半圓的餅狀圖逼争。

參考:

  1. zhuanghongji·MPAndroidChart 圖表庫(kù)的API練習(xí)
  2. android開源圖表庫(kù)MPAndroidChart

Panda
2016-08-03

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市劝赔,隨后出現(xiàn)的幾起案子誓焦,更是在濱河造成了極大的恐慌,老刑警劉巖着帽,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杂伟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡启摄,警方通過查閱死者的電腦和手機(jī)稿壁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門幽钢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歉备,“玉大人,你說我怎么就攤上這事匪燕±傺颍” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵帽驯,是天一觀的道長(zhǎng)龟再。 經(jīng)常有香客問我,道長(zhǎng)尼变,這世上最難降的妖魔是什么利凑? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮嫌术,結(jié)果婚禮上哀澈,老公的妹妹穿的比我還像新娘。我一直安慰自己度气,他們只是感情好割按,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著磷籍,像睡著了一般适荣。 火紅的嫁衣襯著肌膚如雪现柠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天弛矛,我揣著相機(jī)與錄音够吩,去河邊找鬼。 笑死丈氓,一個(gè)胖子當(dāng)著我的面吹牛废恋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扒寄,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼鱼鼓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了该编?” 一聲冷哼從身側(cè)響起迄本,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎课竣,沒想到半個(gè)月后嘉赎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡于樟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年公条,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迂曲。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡靶橱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出路捧,到底是詐尸還是另有隱情关霸,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布杰扫,位于F島的核電站队寇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏章姓。R本人自食惡果不足惜佳遣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凡伊。 院中可真熱鬧零渐,春花似錦、人聲如沸窗声。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拦耐,卻和暖如春耕腾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杀糯。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工扫俺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人固翰。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓狼纬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親骂际。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疗琉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 太長(zhǎng)了,還是轉(zhuǎn)載吧...今天在看博客的時(shí)候歉铝,無意中發(fā)現(xiàn)了@Trinea在GitHub上的一個(gè)項(xiàng)目Android開源...
    龐哈哈哈12138閱讀 20,182評(píng)論 3 283
  • 客戶端請(qǐng)求服務(wù)器 服務(wù)器返回一個(gè)CA證書證書中含有服務(wù)器的公鑰證書中含有CA的公鑰(解密用) 使用證書中的CA公鑰...
    pdog18閱讀 2,251評(píng)論 0 0
  • 11月21號(hào)這一天,真的感覺很悲傷無望类缤,然后連家里的愛貓也病重似的臼勉,受不了…… 然而難以入眠的我因?yàn)楹闷娑l(fā)現(xiàn)了簡(jiǎn)...
    玉杺閱讀 235評(píng)論 0 1
  • 文/Nico “蟬鳴的夏季宴霸,我想遇見你” 01回魂深處,是那個(gè)破落的小雜院岸裙。 有人說猖败,夢(mèng)境可以真實(shí)反映一個(gè)人靈魂最...
    Nico尼可閱讀 1,148評(píng)論 9 21
  • 走進(jìn)寂寞的沙洲 心在向陽(yáng)光暢想 夢(mèng)的西游 會(huì)是那場(chǎng)追求 ...
    米瀾盛若閱讀 170評(píng)論 0 0