MPAndroidChart---CombinedChart(K線圖+均線)

CombinedChart是柱狀圖和折線圖的組合圖形,固然也能夠做爲CandleStickChart和折線圖的組合圖形, 也就是K線圖和均線java

/**
 * 蠟燭圖和折線圖的組合圖形
 */
public class CombinedChartUtils {
    private CombinedChart combinedChart;
    private XAxis xAxis;

    public CombinedChartUtils(CombinedChart combinedChart){
        this.combinedChart = combinedChart;
        initSetting();

    }

    /**
     * 經常使用設置
     */
    private void initSetting() {
        combinedChart.getDescription().setText("");
        combinedChart.getDescription().setTextColor(Color.RED);
        combinedChart.getDescription().setTextSize(16);//設置描述的文字 ,顏色 大小
        combinedChart.setNoDataText("無數據噢"); //沒數據的時候顯示
        //這裏爲了 能夠使左右滑動
        Matrix m=new Matrix();
        m.postScale(1.5f, 1f);//兩個參數分別是x,y軸的縮放比例。例如:將x軸的數據放大爲以前的1.5倍
        combinedChart.getViewPortHandler().refresh(m, combinedChart, false);//將圖表動畫顯示以前進行縮放
        combinedChart.animateX(1000); // 當即執行的動畫,x軸

        //設置圖例
        Legend legend = combinedChart.getLegend();
//        legend.setForm(Legend.LegendForm.NONE); //直接禁止圖例,x軸會顯示不全, 用這種方法解決
//        legend.setTextColor(Color.TRANSPARENT);

        //設置X軸
        xAxis = combinedChart.getXAxis();
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//設置x軸位置
        xAxis.setAxisMinimum(1);//設置x軸最小
//        xAxis.setAxisMaximum(12);//設置x軸最大值
        xAxis.setTextSize(14);
        xAxis.setTextColor(Color.RED);
        xAxis.setEnabled(true);//是否顯示x軸是否禁用
        xAxis.setDrawLabels(true); //設置x軸標籤 即x軸上顯示的數值
        xAxis.setDrawGridLines(true);//是否設置x軸上每一個點對應的線 即 豎向的網格線
        xAxis.enableGridDashedLine(2,2,2); //豎線 虛線樣式  lineLength控制虛線段的長度 spaceLength控制線之間的空間
        xAxis.setLabelRotationAngle(30f);//設置x軸標籤的旋轉角度
        xAxis.setGranularity(1f);//x軸上設置間隔尺寸

        //設置Y軸
        YAxis yAxisLef = combinedChart.getAxisLeft();
        yAxisLef.setTextSize(14);
        yAxisLef.setAxisMinimum(0);
        YAxis yAxisRight = combinedChart.getAxisRight();//獲取右側y軸
        yAxisRight.setEnabled(false);//設置是否禁止
    }

    /**
     * 設置單條折線圖的K線圖 數據
     */
    public void setSingleCombinedData(List<Entry> lineYVals, List<CandleEntry> candleYVals){
        xAxis.setAxisMinimum(0);
        xAxis.setAxisMaximum((float)(candleYVals.size()+0.5)); //防止出現顯示一半柱狀圖的狀況
        CombinedData data = new CombinedData();
        LineData lineData = getSingleMa(lineYVals);
        data.setData(lineData);
        CandleData candleData = getCandleData(candleYVals);
        data.setData(candleData);
        combinedChart.setData(data);
    }

    /**
     * 折線圖(多條)
     * @param lineChartYs 折線Y軸值
     * @param lineNames   折線圖名字
     * @param lineColors  折線顏色
     * @param candleYVals  K線圖的y值
     * @return
     */
    public void setMoreCombinedData(List<List<Float>> lineChartYs, List<String> lineNames, List<Integer> lineColors, List<CandleEntry> candleYVals){
        xAxis.setAxisMinimum(0);
        xAxis.setAxisMaximum((float)(candleYVals.size()+1)); //防止出現顯示一半柱狀圖的狀況

        CombinedData data = new CombinedData();
        LineData lineData = getMoreMA(lineChartYs, lineNames, lineColors);
        data.setData(lineData);
        CandleData candleData = getCandleData(candleYVals);
        data.setData(candleData);
        combinedChart.setData(data);
    }

    /**
     * 獲取蠟燭圖(K線圖)
     * @param candleYVals
     * @return
     */
    private CandleData getCandleData(List<CandleEntry> candleYVals){
        CandleDataSet candleDataSet = new CandleDataSet(candleYVals, "");
        candleDataSet.setValueTextColor(Color.BLACK);
        candleDataSet.setValueTextSize(14);
        candleDataSet.setShadowColor(Color.DKGRAY);//設置影線的顏色
        candleDataSet.setShadowWidth(0.5f);//設置影線的寬度
        candleDataSet.setShadowColorSameAsCandle(true);//設置影線和蠟燭圖的顏色同樣
        candleDataSet.setDecreasingColor(Color.GREEN);//設置減小色
        candleDataSet.setDecreasingPaintStyle(Paint.Style.STROKE);//綠跌,空心描邊
        candleDataSet.setIncreasingColor(Color.RED);//設置增加色
        candleDataSet.setIncreasingPaintStyle(Paint.Style.FILL);//設置增加紅 實心
        candleDataSet.setNeutralColor(Color.RED);//當天價格不漲不跌(一字線)顏色
        candleDataSet.setHighlightEnabled(true);//設置定位線是否可用
        candleDataSet.setHighLightColor(Color.BLACK); //設置定位線的顏色
        candleDataSet.setHighlightLineWidth(0.5f);//設置定位線的線寬
        candleDataSet.setBarSpace(0.9f);//0 至1 之間,越小蠟燭圖的寬度越寬
        candleDataSet.setDrawValues(false);//設置是否顯示蠟燭圖上的文字
        CandleData candleData = new CandleData(candleDataSet);
        return candleData;
    }

    /**
     * 獲取單條均線
     * @param lineYVals y軸值
     * @return
     */
    private LineData getSingleMa(List<Entry> lineYVals){
        LineDataSet lineDataSet = new LineDataSet(lineYVals, "");
        lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);// 設置平滑曲線
        lineDataSet.setHighLightColor(Color.RED); //設置高亮線的顏色
        lineDataSet.setHighlightEnabled(false);//設置高亮線是否可用
        lineDataSet.setColor(Color.BLACK);//設置折線顏色
        lineDataSet.setCircleColor(Color.BLUE);//設置交點的圓圈的顏色
        lineDataSet.setDrawCircles(false);//設置是否顯示交點
        lineDataSet.setDrawValues(false); //設置是否顯示交點處的數值
        lineDataSet.setValueTextColor(Color.RED); //設置交點上值的顏色
        lineDataSet.setValueTextSize(14);//設置交點上值的字體大小
        LineData lineData = new LineData(lineDataSet);
        return lineData;
    }

    /**
     * 折線圖(多條)
     * @param lineChartYs 折線Y軸值
     * @param lineNames   折線圖名字
     * @param lineColors  折線顏色
     * @return
     */
    private LineData getMoreMA(List<List<Float>> lineChartYs, List<String> lineNames, List<Integer> lineColors){
            LineData lineData = new LineData();

            for (int i = 0; i < lineChartYs.size(); i++) {
                ArrayList<Entry> yValues = new ArrayList<>();
                for (int j = 0; j < lineChartYs.get(i).size(); j++) {
                    yValues.add(new Entry(j, lineChartYs.get(i).get(j)));
                }
                LineDataSet lineDataSet = new LineDataSet(yValues, lineNames.get(i));
                lineDataSet.setColor(lineColors.get(i));//設置折線顏色
                lineDataSet.setCircleColor(lineColors.get(i)); //設置交點圓的顏色
                lineDataSet.setValueTextColor(lineColors.get(i));
                lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);// 設置平滑曲線
                lineDataSet.setHighLightColor(Color.RED); //設置高亮線的顏色
                lineDataSet.setHighlightEnabled(false);//設置高亮線是否可用
                lineDataSet.setDrawCircles(false);//設置是否顯示交點
                lineDataSet.setDrawValues(false); //設置是否顯示交點處的數值
                lineDataSet.setValueTextSize(14);//設置交點上值的字體大小
                lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
                lineData.addDataSet(lineDataSet);
            }
            return lineData;
    }
}

Activity中使用,傳遞數據,這是單條折線圖dom

List<Entry> lineEntry = new ArrayList<>();
        lineEntry.add(new Entry(0,3));
        lineEntry.add(new Entry(1,5));
        lineEntry.add(new Entry(2,6));
        lineEntry.add(new Entry(3,5));
        lineEntry.add(new Entry(4,2));
        lineEntry.add(new Entry(5,8));

        List<CandleEntry> barEntry = new ArrayList<>();
        barEntry.add(new CandleEntry(1,8,1,3f,6f));
        barEntry.add(new CandleEntry(2,8,1,8f,2f));
        barEntry.add(new CandleEntry(3,3,2,2f,2f));
        barEntry.add(new CandleEntry(4,5,1,4f,2f));
        barEntry.add(new CandleEntry(5,6,2,3f,3f));
        barEntry.add(new CandleEntry(6,8,2,3f,6f));
        barEntry.add(new CandleEntry(7,7,3,3f,6f));
        barEntry.add(new CandleEntry(8,7,2,6f,2f));
        barEntry.add(new CandleEntry(9,6,2,2f,6f));
        barEntry.add(new CandleEntry(10,9,5,6f,7f));
        barEntry.add(new CandleEntry(11,5,1,3f,4f));
//        combinedChartUtils.setSingleCombinedData(lineEntry,barEntry); //單條直線圖的K線圖

多條折線圖的數據傳遞post

List<String> names = new ArrayList<>();
        names.add("MA5");
        names.add("MA10");
        names.add("MA30");

        List<Integer> colors = new ArrayList<>();
        colors.add(Color.YELLOW);
        colors.add(Color.RED);
        colors.add(Color.DKGRAY);

        //y軸數據集合
        List<List<Float>> yLineDatas = new ArrayList<>();
        //4種直方圖
        for (int i = 0; i < 3; i++) {
            //y軸數
            List<Float> yData = new ArrayList<>();
            for (int j = 0; j <= 20; j++) {
                yData.add((float) (Math.random() * 10));
            }
            yLineDatas.add(yData);
        }
        combinedChartUtils.setMoreCombinedData(yLineDatas,names,colors,barEntry); //設置多條折線

截圖如上,可是關於圖例有一點,若是我只想顯示均線的圖例,不顯示蠟燭圖的圖例,怎麼實現呢?求大神告知,字體

我暫時想到的方法就是使用圖例的setCustom方法,自定義圖例,這能夠實現,不知道還有沒有別的方式動畫

相關文章
相關標籤/搜索