1. 程式人生 > >基於MPAndroidChart庫製作K線圖(三) —— 手勢高亮聯動

基於MPAndroidChart庫製作K線圖(三) —— 手勢高亮聯動

目錄
基於MPAndroidChart庫製作K線圖(一) ­­­­­­­­­­­­—— 基礎圖
基於MPAndroidChart庫製作K線圖(二) ­­­­­­­­­­­­—— 自定義x、y軸
基於MPAndroidChart庫製作K線圖(三) ­­­­­­­­­­­­—— 手勢高亮聯動


一、效果圖

二、高亮聯動
圖表聯動高亮顯示時,通過OnChartValueSelectedListener()可以監聽到圖表的Entry值,通過k線圖高亮來處理柱狀圖的高亮聯動就需要重寫onValueSelected方法

@Override
public void
onValueSelected(Entry e, Highlight h) { if (dstCharts != null) { for (BarLineChartBase chart : dstCharts) { float touchY = h.getDrawY();//手指接觸點在srcChart上的Y座標,即手勢監聽器中儲存資料 float y = h.getY(); if (chart instanceof BarChart) { y = touchY - srcChart.getHeight(); } else
if (chart instanceof CombinedChart) { y = touchY + chart.getHeight(); } Highlight hl = new Highlight(h.getX(), Float.NaN, h.getDataSetIndex()); hl.setDraw(h.getX(), y); chart.highlightValues(new Highlight[]{hl}); } } if
(mListener != null) { mListener.valueSelected(e); } }

然後給CombinedChart和BarChart分別設定高亮監聽

因為k線圖本身有左右滑動的監聽,如果再滑動高亮線的話就會衝突,而在觸發k線圖的監聽OnChartGestureListener之前通過view的onTouch來更改手勢變化

@Override
public boolean onTouch(View v, MotionEvent event) {
    mDetector.onTouchEvent(event);
    if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) {
        mIsLongPress = false;
        mChart.highlightValue(null, true);
        if (mListener != null) {
            mListener.disableHighlight();
        }
        mChart.enableScroll();
    }
    if (mIsLongPress && event.getAction() == MotionEvent.ACTION_MOVE) {
        if (mListener != null) {
            mListener.enableHighlight();
        }
        Highlight h = mChart.getHighlightByTouchPoint(event.getX(), event.getY());
        if (h != null) {
            h.setDraw(event.getX(), event.getY());
            mChart.highlightValue(h, true);
            mChart.disableScroll();
        }
        return true;
    }
    return false;
}

三、原始碼下載

github: https://github.com/xkdaq/KoinChart
coding: https://coding.net/u/xkdaq/p/KoinChart/git