最后将画在5、6、7、8……上的点连起来,就是5节点均线。(如果当前一个节点代表一天,那这条线就是5日均线)
源码
–
在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);
}