MPAndroidChart實現(xiàn)K線面板(一)

這篇文章主要介紹如何使用MPAndroidChart庫實現(xiàn)K線面板的相關功能骡送,我們會著重介紹以下幾個方面:

1.繪制K線圖和展示股票數(shù)據(jù)

2.處理用戶手勢操作

3.拉伸和壓縮K線圖

最終的效果圖:

圖1

源碼下載地址:https://github.com/Lonely7th/TsAndroidClient

繪制K線圖和展示股票數(shù)據(jù)

繪制K線圖需要用到真實的股票數(shù)據(jù)淹冰,網(wǎng)上有很多免費的接口可以使用,我們也可以自己編寫一個股票數(shù)據(jù)接口 Python實現(xiàn)股票數(shù)據(jù)接口

1.將MPAndroidChart集成到項目中

在project根目錄的build.gradle添加中央庫地址:

allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}

在項目build.gradle中添加相關依賴:

dependencies {
    compile 'com.github.PhilJay:MPAndroidChart:v2.2.4'
}

2.在布局文件中添加CandleStickChart

<com.github.mikephil.charting.charts.CandleStickChart
        android:id="@+id/candler_chart"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/top_line"
        android:layout_above="@+id/rl_bottom_view"/>
mChart = findViewById(R.id.candler_chart);

3.基本參數(shù)設置

設置提示文字

mChart.setNoDataTextDescription("加載中...");//如果沒有數(shù)據(jù)的時候兵罢,會顯示這個

設置背景顏色

mChart.setDrawGridBackground(false);//是否顯示表格顏色
mChart.setBackgroundColor(Color.BLACK);//設置背景
mChart.setGridBackgroundColor(Color.BLACK);//設置表格背景色

設置坐標軸栗柒,坐標軸分為x軸、左y軸和右y軸就珠,可以分別設置寇壳,這里我們?nèi)∠鹸軸和右y軸醒颖,只設置左y軸的屬性。

//設置x軸
XAxis xAxis = mChart.getXAxis();
xAxis.setEnabled(false);
//設置y軸(左邊)
YAxis leftAxis = mChart.getAxisLeft();
leftAxis.setEnabled(true);
leftAxis.setLabelCount(5, false);
leftAxis.setDrawGridLines(true);//繪制網(wǎng)格線
leftAxis.setDrawAxisLine(false);
leftAxis.setGridColor(ContextCompat.getColor(MainActivity.this, R.color.gray_overlay));//設置網(wǎng)格線的顏色
leftAxis.setTextColor(Color.WHITE);//坐標軸文字顏色
leftAxis.setValueFormatter(new MyYAxisValueFormatter());//坐標軸文字格式
//設置y軸(右邊)
YAxis rightAxis = mChart.getAxisRight();
rightAxis.setEnabled(false);

設置高亮

mChart.setHighlightPerDragEnabled(false);//直接拖動屏幕時不顯示高亮
mChart.setHighlightPerTapEnabled(false);//點擊屏幕時不顯示高亮

設置監(jiān)聽(在第二個章節(jié)中我們會詳細介紹如何使用這些監(jiān)聽實現(xiàn)各種手勢操作壳炎,這里不再贅述)

mChart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() {
            @Override
            public void onValueSelected(Entry e, int dataSetIndex, Highlight h) {
                if (isLongPressed) {
                }
            }

            @Override
            public void onNothingSelected() {
            }
        });
mChart.setOnChartGestureListener(new OnChartGestureListener() {
            @Override
            public void onChartGestureStart(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {

            }

            @Override
            public void onChartGestureEnd(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {
                
            }

            @Override
            public void onChartLongPressed(MotionEvent me) {
                
            }

            @Override
            public void onChartDoubleTapped(MotionEvent me) {
               
            }

            @Override
            public void onChartSingleTapped(MotionEvent me) {

            }

            @Override
            public void onChartFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY) {
                
            }

            @Override
            public void onChartScale(MotionEvent me, float scaleX, float scaleY) {

            }

            @Override
            public void onChartTranslate(MotionEvent me, float dX, float dY) {

            }
        });

4.獲取數(shù)據(jù)/添加數(shù)據(jù)

這里我們通過 http://47.95.243.173/tkdata?code=000001接口獲取數(shù)據(jù)泞歉,接口的實現(xiàn)過程請點擊 Python實現(xiàn)股票數(shù)據(jù)接口

  OkGo.get(HttpApi.BASE_URL).tag(this)
         .params("code", tkCode)
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(String s, Call call, Response response) {
                        try {
                            Log.d(TAG, s);
                            JSONObject result = new JSONObject(s);
                            if (result.getInt("code") == 200) {
                                loadError = false;
                                if (tkData != null) {
                                    tkData.clear();
                                }
                                String data = result.getString("data");
                                JSONArray array = new JSONArray(data);
                                for (int i = 0; i < array.length(); i++) {
                                    JSONObject item = (JSONObject) array.opt(array.length() - 1 - i);
                                    //解析基礎數(shù)據(jù)
                                    TkDetailsBean bean = new TkDetailsBean(
                                            item.getString("cur_min_price"), item.getString("cur_close_price"),
                                            item.getString("cur_timer"), item.getString("cur_price_range"),
                                            item.getString("cur_max_price"), item.getString("cur_total_money"),
                                            item.getString("cur_total_volume"), item.getString("cur_open_price")
                                    );
                                    tkData.add(bean);
                                }
                               
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onError(Call call, Response response, Exception e) {
                        super.onError(call, response, e);
                        if (reLoad) {
                            loadStickData(tkCode, false);//首次加載失敗時再次加載
                        } else {
                            loadError = true;
                            SharedPreferencesUtils.setCurrentTkCode(tkCode);
                            ToastUtils.makeToast(MainActivity.this, "加載失敗,請檢查網(wǎng)絡");
                        }
                    }

獲取到數(shù)據(jù)后我們創(chuàng)建一個CandleDataSet對象匿辩,CandleDataSet需要傳入一個List<CandleEntry>類型的參數(shù)腰耙,這個參數(shù)就是待展示的股票數(shù)據(jù)

CandleEntry ce = new CandleEntry(i-start_index, shadowH, shadowL, open, close);
yVals.add(ce);
candleDataSet = new CandleDataSet(yVals, "");
candleDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
candleDataSet.setShadowColor(Color.DKGRAY);//影線顏色
candleDataSet.setShadowColorSameAsCandle(true);//影線顏色與實體一致
candleDataSet.setShadowWidth(0.7f);//影線candleDataSet.setDecreasingColor(ContextCompat.getColor(MainActivity.this, R.color.blue_overlay));//下跌的顏色
candleDataSet.setDecreasingPaintStyle(Paint.Style.FILL);//紅漲,實體
candleDataSet.setIncreasingColor(Color.RED);//上漲的顏色
candleDataSet.setIncreasingPaintStyle(Paint.Style.STROKE);//綠跌铲球,空心
candleDataSet.setNeutralColor(Color.RED);//當天價格不漲不跌(一字線)顏色
candleDataSet.setHighlightLineWidth(0.5f);//選中蠟燭時的線寬 candleDataSet.setDrawValues(false);//在圖表中的元素上面是否顯示數(shù)值
candleDataSet.setHighLightColor(ContextCompat.getColor(MainActivity.this, R.color.y_page_bg));//高亮的顏色
CandleData candleData = new CandleData(xVals, candleDataSet);

最后我們將candleDataSet綁定到CandleStickChart

mChart.setData(candleData);

到此為止挺庞,我們已經(jīng)使用MPAndroidChart完成了一個靜態(tài)的K線面板,下個章節(jié)我們將介紹如何為K線面板添加手勢操作

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末稼病,一起剝皮案震驚了整個濱河市选侨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌然走,老刑警劉巖援制,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芍瑞,居然都是意外死亡晨仑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洪己,“玉大人妥凳,你說我怎么就攤上這事〈鸩叮” “怎么了猾封?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長噪珊。 經(jīng)常有香客問我晌缘,道長,這世上最難降的妖魔是什么痢站? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任磷箕,我火速辦了婚禮,結果婚禮上阵难,老公的妹妹穿的比我還像新娘岳枷。我一直安慰自己,他們只是感情好呜叫,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布空繁。 她就那樣靜靜地躺著,像睡著了一般朱庆。 火紅的嫁衣襯著肌膚如雪盛泡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天娱颊,我揣著相機與錄音傲诵,去河邊找鬼。 笑死箱硕,一個胖子當著我的面吹牛拴竹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剧罩,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼栓拜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惠昔?” 一聲冷哼從身側響起幕与,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舰罚,沒想到半個月后纽门,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡营罢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年赏陵,在試婚紗的時候發(fā)現(xiàn)自己被綠了饼齿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝙搔,死狀恐怖缕溉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吃型,我是刑警寧澤证鸥,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站勤晚,受9級特大地震影響枉层,放射性物質發(fā)生泄漏。R本人自食惡果不足惜赐写,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一鸟蜡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挺邀,春花似錦揉忘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至禾蚕,卻和暖如春您朽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背夕膀。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工虚倒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人产舞。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像菠剩,于是被迫代替她去往敵國和親易猫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

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