k線圖展示.gif
上兩篇說了分時圖的畫法,這篇來說下股票k線圖的畫法
因為股票k線圖有蠟燭圖和線性圖所以我們需要用組合圖來完成,首先我們需要重寫組合圖來實現(xiàn)markerView的自定義
根據(jù)自己需求而定這里我只是怎么實現(xiàn)的思路及部分代碼
1.畫markerview
1>繼承CombinedChart并重寫drawMarkers這個方法
2>將自定義的view畫上去绅作,
1.畫左邊的標記值
畫左邊標記.png
3>底部標記
底部標記.png
2.畫最高最低的標記
因為我們畫k線的最高最低點所以我們找到CandleStickChartRenderer這個類塘幅,在這個類中我們找到drawValues這個方法,我們添加以下代碼
//這個方法是我自己加的乒验,是否顯示最大最小
if (dataSet.getIsShowMaxAndMin()) {
//計算最大最小值
float maxValue = 0, minValue = 0;
int maxIndex = 0, minIndex = 0;
CandleEntry maxEntry = null;
boolean firstInit = true;
for (int j = 0; j < positions.length; j += 2) {
float x = positions[j];
float y = positions[j + 1];
if (!mViewPortHandler.isInBoundsRight(x))
break;
if (!mViewPortHandler.isInBoundsLeft(x) || !mViewPortHandler.isInBoundsY(y))
continue;
CandleEntry entry = dataSet.getEntryForIndex((j / 2 + mXBounds.min));
if (firstInit) {
maxValue = entry.getHigh();
minValue = entry.getLow();
firstInit = false;
maxEntry = entry;
} else {
if (entry.getHigh() > maxValue) {
maxValue = entry.getHigh();
maxIndex = j;
maxEntry = entry;
}
if (entry.getLow() < minValue) {
minValue = entry.getLow();
minIndex = j;
}
}
}
//繪制最大值和最小值
float x = positions[minIndex];
if (maxIndex > minIndex) {
//畫右邊
String highString = "← " + Float.toString(minValue);
//計算顯示位置
//計算文本寬度
int highStringWidth = Utils.calcTextWidth(mValuePaint, highString);
float[] tPosition = new float[2];
tPosition[1] = minValue;
trans.pointValuesToPixel(tPosition);
mValuePaint.setTextSize(20);
mValuePaint.setColor(dataSet.getValueTextColor(minIndex / 2));
mValuePaint.setStrokeWidth(3f);
c.drawText(highString, x + highStringWidth / 2, tPosition[1], mValuePaint);
} else {
//畫左邊
String highString = Float.toString(minValue) + " →";
//計算顯示位置
int highStringWidth = Utils.calcTextWidth(mValuePaint, highString);
float[] tPosition = new float[2];
tPosition[1] = minValue;
trans.pointValuesToPixel(tPosition);
mValuePaint.setTextSize(20);
mValuePaint.setColor(dataSet.getValueTextColor(minIndex / 2));
mValuePaint.setStrokeWidth(3f);
c.drawText(highString, x - highStringWidth / 2, tPosition[1], mValuePaint);
}
if (maxIndex > minIndex) {
//畫左邊
String highString = Float.toString(maxValue) + " →";
int highStringWidth = Utils.calcTextWidth(mValuePaint, highString);
float[] tPosition = new float[2];
tPosition[0] = maxEntry == null ? 0f : maxEntry.getX();
tPosition[1] = maxEntry == null ? 0f : maxEntry.getHigh();
trans.pointValuesToPixel(tPosition);
mValuePaint.setTextSize(20);
mValuePaint.setColor(dataSet.getValueTextColor(maxIndex / 2));
mValuePaint.setStrokeWidth(3f);
c.drawText(highString, tPosition[0] - highStringWidth / 2, tPosition[1], mValuePaint);
} else {
//畫右邊
String highString = "← " + Float.toString(maxValue);
//計算顯示位置
int highStringWidth = Utils.calcTextWidth(mValuePaint, highString);
float[] tPosition = new float[2];
tPosition[0] = maxEntry == null ? 0f : maxEntry.getX();
tPosition[1] = maxEntry == null ? 0f : maxEntry.getHigh();
trans.pointValuesToPixel(tPosition);
mValuePaint.setTextSize(20);
mValuePaint.setColor(dataSet.getValueTextColor(maxIndex / 2));
mValuePaint.setStrokeWidth(3f);
c.drawText(highString, tPosition[0] + highStringWidth / 2, tPosition[1], mValuePaint);
}
}
這樣就可以實現(xiàn)最大最小了愚隧。
下篇文章我們說說k線的分頁滑動加載更多和高亮線的相關(guān)
有問題希望大家提出來