MPAndroidChart的K线图上添加均线

最后将画在5、6、7、8……上的点连起来,就是5节点均线。(如果当前一个节点代表一天,那这条线就是5日均线)


源码

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

在CandleStickChartRenderer.java下添加画均线的方法

思路:在draw K线柱子的时候获取每个柱子的收盘值,根据收盘值,计算均值

Demo Code


均线的实现,请移步到在MPAndroidChart库K线图的基础上画均线

下面实现的均线是第一版,见效果图,实现逻辑上略有问题,可直接忽略


@Override

public void drawData(Canvas c) {



    CandleData candleData = mChart.getCandleData();



    for (CandleDataSet set : candleData.getDataSets()) {



        if (set.isVisible() && set.getEntryCount() > 0)

            drawDataSet(c, set);

    }

}



protected void drawDataSet(Canvas c, CandleDataSet dataSet) {



    Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());



    float phaseX = mAnimator.getPhaseX();

    float phaseY = mAnimator.getPhaseY();



    int dataSetIndex = mChart.getCandleData().getIndexOfDataSet(dataSet);



    List<CandleEntry> entries = dataSet.getYVals();



    int minx = Math.max(mMinX, 0);

    int maxx = Math.min(mMaxX + 1, entries.size());



    int range = (maxx - minx) * 4;

    int to = (int) Math.ceil((maxx - minx) * phaseX + minx);



    CandleBodyBuffer bodyBuffer = mBodyBuffers[dataSetIndex];

    bodyBuffer.setBodySpace(dataSet.getBodySpace());

    bodyBuffer.setPhases(phaseX, phaseY);

    bodyBuffer.limitFrom(minx);

    bodyBuffer.limitTo(maxx);

    bodyBuffer.feed(entries);



    trans.pointValuesToPixel(bodyBuffer.buffer);



    CandleShadowBuffer shadowBuffer = mShadowBuffers[dataSetIndex];

    shadowBuffer.setPhases(phaseX, phaseY);

    shadowBuffer.limitFrom(minx);

    shadowBuffer.limitTo(maxx);

    shadowBuffer.feed(entries);



    trans.pointValuesToPixel(shadowBuffer.buffer);



    mRenderPaint.setStrokeWidth(dataSet.getShadowWidth());



    ArrayList<Float> closes = new ArrayList<Float>();

    ArrayList<Float> jx = new ArrayList<Float>();

    // draw the body

    for (int j = 0; j < range; j += 4) {



        // get the entry

        CandleEntry e = entries.get(j / 4 + minx);



        if (!fitsBounds(e.getXIndex(), mMinX, to))

            continue;



        if (dataSet.getShadowColorSameAsCandle()) {



            if (e.getOpen() > e.getClose())

                mRenderPaint.setColor(

                        dataSet.getDecreasingColor() == ColorTemplate.COLOR_NONE ?

                                dataSet.getColor(j) :

                                dataSet.getDecreasingColor()

                );



            else if (e.getOpen() < e.getClose())

                mRenderPaint.setColor(

                        dataSet.getIncreasingColor() == ColorTemplate.COLOR_NONE ?

                                dataSet.getColor(j) :

                                dataSet.getIncreasingColor()

                );



            else

                mRenderPaint.setColor(

                        dataSet.getShadowColor() == ColorTemplate.COLOR_NONE ?

                                dataSet.getColor(j) :

                                dataSet.getShadowColor()

                );



        } else {

            mRenderPaint.setColor(

                    dataSet.getShadowColor() == ColorTemplate.COLOR_NONE ?

                            dataSet.getColor(j) :

                            dataSet.getShadowColor()

            );

        }



        mRenderPaint.setStyle(Paint.Style.STROKE);



        // draw the shadow

        c.drawLine(shadowBuffer.buffer[j], shadowBuffer.buffer[j + 1],

                shadowBuffer.buffer[j + 2], shadowBuffer.buffer[j + 3],

                mRenderPaint);



        float leftBody = bodyBuffer.buffer[j];

        float open = bodyBuffer.buffer[j + 1];

        float rightBody = bodyBuffer.buffer[j + 2];

        float close = bodyBuffer.buffer[j + 3];

        closes.add(close);

        jx.add((leftBody + rightBody) / 2);



        // draw body differently for increasing and decreasing entry

        if (open > close) { // decreasing



            if (dataSet.getDecreasingColor() == ColorTemplate.COLOR_NONE) {

                mRenderPaint.setColor(dataSet.getColor(j / 4 + minx));

            } else {

                mRenderPaint.setColor(dataSet.getDecreasingColor());

            }



            mRenderPaint.setStyle(dataSet.getDecreasingPaintStyle());

            // draw the body

            c.drawRect(leftBody, close, rightBody, open, mRenderPaint);



        } else if (open < close) {



            if (dataSet.getIncreasingColor() == ColorTemplate.COLOR_NONE) {

                mRenderPaint.setColor(dataSet.getColor(j / 4 + minx));

            } else {

                mRenderPaint.setColor(dataSet.getIncreasingColor());

            }



            mRenderPaint.setStyle(dataSet.getIncreasingPaintStyle());

            // draw the body

            c.drawRect(leftBody, open, rightBody, close, mRenderPaint);

        } else { // equal values



            mRenderPaint.setColor(dataSet.getShadowColor());

            c.drawLine(leftBody, open, rightBody, close, mRenderPaint);

        }



        // 5节点均线

        drawLine(c, 5, closes, jx);

        // 10节点均线

        drawLine(c, 10, closes, jx);

        // 30节点均线

        drawLine(c, 30, closes, jx);

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值