一步一步教你寫股票走勢(shì)圖——K線圖二(圖表聯(lián)動(dòng))

K線圖越做發(fā)現(xiàn)坑越多,跟之前做的分時(shí)圖完全不是一個(gè)重量級(jí)的啊涧偷,分時(shí)圖不需要滾動(dòng)簸喂,少走了很多彎路,K線圖因?yàn)闈L動(dòng)的問題燎潮,會(huì)導(dǎo)致很多其他問題喻鳄,比如:

  • 多個(gè)圖表之間滾動(dòng)時(shí)怎么聯(lián)動(dòng)
  • 高亮滾動(dòng)沖突
  • 放縮聯(lián)動(dòng)
    ...

表對(duì)齊

下面我們就開始介紹本節(jié)的內(nèi)容,要想實(shí)現(xiàn)圖表之間的聯(lián)動(dòng)确封,那么必須得保證圖表是對(duì)齊的除呵,聯(lián)動(dòng)起來效果才能保持一致,圖表對(duì)齊功能爪喘,我們?cè)诜謺r(shí)圖部分已經(jīng)講解颜曾,代碼一致,還是簡單貼下代碼:

 /*設(shè)置量表對(duì)齊*/
    private void setOffset() {
        float lineLeft = combinedchart.getViewPortHandler().offsetLeft();
        float barLeft = barChart.getViewPortHandler().offsetLeft();
        float lineRight = combinedchart.getViewPortHandler().offsetRight();
        float barRight = barChart.getViewPortHandler().offsetRight();
        float offsetLeft, offsetRight;
 /*注:setExtraLeft...函數(shù)是針對(duì)圖表相對(duì)位置計(jì)算秉剑,比如A表offLeftA=20dp,B表offLeftB=30dp,則A.setExtraLeftOffset(10),并不是30泛豪,還有注意單位轉(zhuǎn)換*/
        if (barLeft < lineLeft) {
            offsetLeft = Utils.convertPixelsToDp(lineLeft - barLeft);
            barChart.setExtraLeftOffset(offsetLeft);
        } else {
            offsetLeft = Utils.convertPixelsToDp(barLeft-lineLeft);
            combinedchart.setExtraLeftOffset(offsetLeft);
        }
  /*注:setExtraRight...函數(shù)是針對(duì)圖表絕對(duì)位置計(jì)算,比如A表offRightA=20dp,B表offRightB=30dp,則A.setExtraLeftOffset(30),并不是10侦鹏,還有注意單位轉(zhuǎn)換*/
        if (barRight < lineRight) {
            offsetRight = Utils.convertPixelsToDp(lineRight);
            barChart.setExtraRightOffset(offsetRight);
        } else {
            offsetRight = Utils.convertPixelsToDp(barRight);
            combinedchart.setExtraRightOffset(offsetRight);
        }

    }

表聯(lián)動(dòng)

表的聯(lián)動(dòng)這里包括滾動(dòng)聯(lián)動(dòng)诡曙、放縮聯(lián)動(dòng),具體操作效果圖還是參照自選股:

這里寫圖片描述

博主在stackover上發(fā)現(xiàn)了有人曾提過類似問題:

這里寫圖片描述

幸運(yùn)的是有人也回答了這個(gè)問題略水,具體請(qǐng)點(diǎn)擊上面的鏈接查看价卤。

public class CoupleChartGestureListener implements OnChartGestureListener {

    private static final String TAG = CoupleChartGestureListener.class.getSimpleName();

    private Chart srcChart;
    private Chart[] dstCharts;

    public CoupleChartGestureListener(Chart srcChart, Chart[] dstCharts) {
        this.srcChart = srcChart;
        this.dstCharts = dstCharts;
    }

  ……

    @Override
    public void onChartScale(MotionEvent me, float scaleX, float scaleY) {
//        Log.d(TAG, "onChartScale " + scaleX + "/" + scaleY + " X=" + me.getX() + "Y=" + me.getY());
        syncCharts();
    }

    @Override
    public void onChartTranslate(MotionEvent me, float dX, float dY) {
//        Log.d(TAG, "onChartTranslate " + dX + "/" + dY + " X=" + me.getX() + "Y=" + me.getY());
        syncCharts();
    }

    public void syncCharts() {
        Matrix srcMatrix;
        float[] srcVals = new float[9];
        Matrix dstMatrix;
        float[] dstVals = new float[9];

        // get src chart translation matrix:
        srcMatrix = srcChart.getViewPortHandler().getMatrixTouch();
        srcMatrix.getValues(srcVals);

        // apply X axis scaling and position to dst charts:
        for (Chart dstChart : dstCharts) {
            if (dstChart.getVisibility() == View.VISIBLE) {
                dstMatrix = dstChart.getViewPortHandler().getMatrixTouch();
                dstMatrix.getValues(dstVals);

                dstVals[Matrix.MSCALE_X] = srcVals[Matrix.MSCALE_X];
                dstVals[Matrix.MSKEW_X] = srcVals[Matrix.MSKEW_X];
                dstVals[Matrix.MTRANS_X] = srcVals[Matrix.MTRANS_X];
                dstVals[Matrix.MSKEW_Y] = srcVals[Matrix.MSKEW_Y];
                dstVals[Matrix.MSCALE_Y] = srcVals[Matrix.MSCALE_Y];
                dstVals[Matrix.MTRANS_Y] = srcVals[Matrix.MTRANS_Y];
                dstVals[Matrix.MPERSP_0] = srcVals[Matrix.MPERSP_0];
                dstVals[Matrix.MPERSP_1] = srcVals[Matrix.MPERSP_1];
                dstVals[Matrix.MPERSP_2] = srcVals[Matrix.MPERSP_2];

                dstMatrix.setValues(dstVals);
                dstChart.getViewPortHandler().refresh(dstMatrix, dstChart, true);
            }
        }
    }
}

于是抱著試試看的態(tài)度試了一下,卻發(fā)現(xiàn)問題了渊涝,請(qǐng)看:

這里寫圖片描述

我們發(fā)現(xiàn)對(duì)同一個(gè)表進(jìn)行滾動(dòng)時(shí)慎璧,沒有任何問題,但是在一個(gè)表滾動(dòng)ing跨释,再對(duì)另一個(gè)表進(jìn)行滾動(dòng)胸私,就會(huì)出現(xiàn)沖突了,剛開始我以為是我的問題煤傍,后來發(fā)現(xiàn)同樣用這端代碼的其他人盖文,也出現(xiàn)這個(gè)問題,不知道哪位大神能給出解決方法蚯姆,請(qǐng)大神留下您那寶貴的意見。
考慮到這個(gè)沖突問題比較嚴(yán)重洒敏,稍微滑動(dòng)就會(huì)出現(xiàn)這種情況龄恋,所以機(jī)智的樓主想出了另一招,加了兩行代碼:

  combinedchart.setDragDecelerationEnabled(false);
  barChart.setDragDecelerationEnabled(false);

估計(jì)有人已經(jīng)知道這兩句代碼的意思了凶伙,作用就是手指滑動(dòng)屏幕郭毕,離開后不會(huì)有慣性滾動(dòng),這雖然解決了上面的bug函荣,但是在體驗(yàn)上卻大不如前显押,不過只好先這么著了扳肛,看效果圖:


這里寫圖片描述

滾動(dòng)聯(lián)動(dòng)已經(jīng)完成,還有放縮聯(lián)動(dòng)呢乘碑,我們看下效果圖:

這里寫圖片描述

ok挖息,木有問題,圖表聯(lián)動(dòng)部分到這里結(jié)束兽肤,下面初步介紹一下高亮聯(lián)動(dòng)套腹,因?yàn)檫@里涉及到手勢(shì)沖突問題,目前只實(shí)現(xiàn)了簡單的點(diǎn)擊高亮聯(lián)動(dòng)资铡,具體的在滾動(dòng)中然后使用高亮电禀,我們?nèi)蘸笤傩醒a(bǔ)充,這里邏輯和分時(shí)圖一樣笤休,直接上代碼:

 combinedchart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() {
            @Override
            public void onValueSelected(Entry e, int dataSetIndex, Highlight h) {
                barChart.highlightValues(new Highlight[]{h});
               // combinedchart.setHighlightValue(h);
            }

            @Override
            public void onNothingSelected() {

            }
        });
        barChart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() {
            @Override
            public void onValueSelected(Entry e, int dataSetIndex, Highlight h) {
                combinedchart.highlightValues(new Highlight[]{h});
             
            }

            @Override
            public void onNothingSelected() {

            }
        });
這里寫圖片描述

本期內(nèi)容就講到這里了尖飞,這只是個(gè)初版,以后還會(huì)改進(jìn)店雅,但是畢竟都是要經(jīng)歷的砍政基,所以還是放出來了,以后慢慢會(huì)優(yōu)化底洗,有好的建議希望能聯(lián)系我腋么,將更好的東西開源出來!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亥揖,一起剝皮案震驚了整個(gè)濱河市珊擂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌费变,老刑警劉巖摧扇,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異挚歧,居然都是意外死亡扛稽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門滑负,熙熙樓的掌柜王于貴愁眉苦臉地迎上來在张,“玉大人,你說我怎么就攤上這事矮慕“镓遥” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵痴鳄,是天一觀的道長瘟斜。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么螺句? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任虽惭,我火速辦了婚禮,結(jié)果婚禮上蛇尚,老公的妹妹穿的比我還像新娘芽唇。我一直安慰自己,他們只是感情好佣蓉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布披摄。 她就那樣靜靜地躺著,像睡著了一般勇凭。 火紅的嫁衣襯著肌膚如雪疚膊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天虾标,我揣著相機(jī)與錄音寓盗,去河邊找鬼。 笑死璧函,一個(gè)胖子當(dāng)著我的面吹牛傀蚌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蘸吓,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼善炫,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了库继?” 一聲冷哼從身側(cè)響起箩艺,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宪萄,沒想到半個(gè)月后艺谆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拜英,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年静汤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片居凶。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虫给,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侠碧,到底是詐尸還是另有隱情狰右,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布舆床,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏挨队。R本人自食惡果不足惜谷暮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盛垦。 院中可真熱鬧湿弦,春花似錦、人聲如沸腾夯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝶俱。三九已至班利,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榨呆,已是汗流浹背罗标。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留积蜻,地道東北人闯割。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像竿拆,于是被迫代替她去往敵國和親宙拉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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