Skip to content

Commit

Permalink
修复数据量少的时候图表的crash
Browse files Browse the repository at this point in the history
  • Loading branch information
VinsonGuo committed Mar 25, 2018
1 parent a747712 commit ab8f535
Show file tree
Hide file tree
Showing 7 changed files with 103 additions and 113 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,8 @@ public T getEntryForXValue(float xValue, float closestToY) {

@Override
public T getEntryForIndex(int index) {
return mValues.get(index);
// return mValues.get(index);
return (mValues == null || mValues.isEmpty()) ? null : mValues.get(index);
}

@Override
Expand Down
14 changes: 12 additions & 2 deletions MPChartLib/说明.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,12 @@
这个只改了了XAxisRenderer的210行,将i/2了
这个是官方库的bug,等待官方修复后通过gradle引用这个库
1改了XAxisRenderer的210行,将i/2了
这个是官方库的bug,等待官方修复后通过gradle引用这个库

2 https://github.com/PhilJay/MPAndroidChart/pull/2462/commits/de2130d7774ed56e0e532b09ef3ecaa834eaf97f
MPChartLib/src/main/java/com/github/mikephil/charting/data/DataSet.java

@Override @Override
public T getEntryForIndex(int index) { public T getEntryForIndex(int index) {
- return mValues.get(index); + return (mValues == null || mValues.isEmpty()) ? null : mValues.get(index);
} }

重写了这个方法,修复个数少的时候的crash
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ android-kline是Android平台的金融图表库,包括**分时图**和**K线
}
}
dependencies {
compile com.github.gzw19931217:android-kline:1.0.1'
compile com.github.gzw19931217:android-kline:1.0.2'
}
```

Expand Down
6 changes: 3 additions & 3 deletions app/src/main/java/com/guoziwei/kline/KLineChartFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,13 @@ protected void initData() {
mKLineView.initData(hisData);
mKLineView.setLimitLine();

/* new Timer().schedule(new TimerTask() {
/*new Timer().schedule(new TimerTask() {
@Override
public void run() {
mKLineView.post(new Runnable() {
@Override
public void run() {
int index = (int) (Math.random() * 100);
int index = (int) (Math.random() * hisData.size());
HisData data = hisData.get(index);
HisData lastData = hisData.get(hisData.size() - 1);
HisData newData = new HisData();
Expand All @@ -121,7 +121,7 @@ public void run() {
}
});
}
}, 1000, 6000);*/
}, 1000, 1000);*/

/* new Timer().schedule(new TimerTask() {
@Override
Expand Down
21 changes: 20 additions & 1 deletion klinelib/src/main/java/com/guoziwei/klinelib/chart/BaseView.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@ class BaseView extends LinearLayout {
protected int mAxisColor;
protected int mTransparentColor;


public int MAX_COUNT = 150;
public int MIN_COUNT = 10;
public int INIT_COUNT = 80;

protected List<HisData> mData = new ArrayList<>(300);

public BaseView(Context context) {
Expand All @@ -58,7 +63,6 @@ protected void initBottomChart(AppCombinedChart chart) {
chart.setBorderWidth(1);
chart.setDragEnabled(true);
chart.setScaleYEnabled(false);
// chart.getDescription().setEnabled(false);
chart.setAutoScaleMinMaxEnabled(true);
chart.setDragDecelerationEnabled(false);
chart.setHighlightPerDragEnabled(false);
Expand Down Expand Up @@ -131,6 +135,21 @@ public String getFormattedValue(float value, AxisBase axis) {
}


protected void moveToLast(AppCombinedChart chart) {
if (mData.size() > INIT_COUNT) {
chart.moveViewToX(mData.size() - INIT_COUNT);
}
}

/**
* set the count of k chart
*/
public void setCount(int init, int max, int min) {
INIT_COUNT = init;
MAX_COUNT = max;
MIN_COUNT = min;
}

protected void setDescription(Chart chart, String text) {
Description description = chart.getDescription();
// float dx = chart.getWidth() - chart.getViewPortHandler().offsetRight() - description.getXOffset();
Expand Down
103 changes: 38 additions & 65 deletions klinelib/src/main/java/com/guoziwei/klinelib/chart/KLineView.java
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,6 @@ public class KLineView extends BaseView implements CoupleChartGestureListener.On
public static final int DIF = 34;
public static final int DEA = 35;

public int MAX_COUNT_K = 300;
public int MIN_COUNT_K = 10;
public int INIT_COUNT_K = 50;

protected AppCombinedChart mChartPrice;
protected AppCombinedChart mChartVolume;
Expand Down Expand Up @@ -245,12 +242,12 @@ public void initData(List<HisData> hisDatas) {
mData.clear();
mData.addAll(DataUtils.calculateHisData(hisDatas));

ArrayList<CandleEntry> lineCJEntries = new ArrayList<>(MAX_COUNT_K);
ArrayList<Entry> ma5Entries = new ArrayList<>(MAX_COUNT_K);
ArrayList<Entry> ma10Entries = new ArrayList<>(MAX_COUNT_K);
ArrayList<Entry> ma20Entries = new ArrayList<>(MAX_COUNT_K);
ArrayList<Entry> ma30Entries = new ArrayList<>(MAX_COUNT_K);
ArrayList<Entry> paddingEntries = new ArrayList<>(MAX_COUNT_K);
ArrayList<CandleEntry> lineCJEntries = new ArrayList<>(INIT_COUNT);
ArrayList<Entry> ma5Entries = new ArrayList<>(INIT_COUNT);
ArrayList<Entry> ma10Entries = new ArrayList<>(INIT_COUNT);
ArrayList<Entry> ma20Entries = new ArrayList<>(INIT_COUNT);
ArrayList<Entry> ma30Entries = new ArrayList<>(INIT_COUNT);
ArrayList<Entry> paddingEntries = new ArrayList<>(INIT_COUNT);

for (int i = 0; i < mData.size(); i++) {
HisData hisData = mData.get(i);
Expand All @@ -273,8 +270,8 @@ public void initData(List<HisData> hisDatas) {
}
}

if (!mData.isEmpty() && mData.size() < INIT_COUNT_K) {
for (int i = mData.size(); i < INIT_COUNT_K; i++) {
if (!mData.isEmpty() && mData.size() < MAX_COUNT) {
for (int i = mData.size(); i < MAX_COUNT; i++) {
paddingEntries.add(new Entry(i, (float) mData.get(mData.size() - 1).getClose()));
}
}
Expand All @@ -291,9 +288,10 @@ public void initData(List<HisData> hisDatas) {
combinedData.setData(candleData);
mChartPrice.setData(combinedData);

mChartPrice.setVisibleXRange(MAX_COUNT_K, MIN_COUNT_K);
mChartPrice.setVisibleXRange(MAX_COUNT, MIN_COUNT);
mChartPrice.notifyDataSetChanged();
mChartPrice.moveViewToX(combinedData.getEntryCount());
// mChartPrice.moveViewToX(combinedData.getEntryCount());
moveToLast(mChartPrice);
initChartVolumeData();
initChartMacdData();
initChartKdjData();
Expand All @@ -304,10 +302,12 @@ public void initData(List<HisData> hisDatas) {
mChartMacd.getXAxis().setAxisMaximum(mChartMacd.getData().getXMax() + 0.5f);
mChartKdj.getXAxis().setAxisMaximum(mChartKdj.getData().getXMax() + 0.5f);

mChartPrice.zoom(MAX_COUNT_K * 1f / INIT_COUNT_K, 0, 0, 0);
mChartVolume.zoom(MAX_COUNT_K * 1f / INIT_COUNT_K, 0, 0, 0);
mChartMacd.zoom(MAX_COUNT_K * 1f / INIT_COUNT_K, 0, 0, 0);
mChartKdj.zoom(MAX_COUNT_K * 1f / INIT_COUNT_K, 0, 0, 0);
mChartPrice.zoom(MAX_COUNT * 1f / INIT_COUNT, 0, 0, 0);
mChartVolume.zoom(MAX_COUNT * 1f / INIT_COUNT, 0, 0, 0);
mChartMacd.zoom(MAX_COUNT * 1f / INIT_COUNT, 0, 0, 0);
mChartKdj.zoom(MAX_COUNT * 1f / INIT_COUNT, 0, 0, 0);

lineData.removeDataSet(0);

HisData hisData = getLastData();
setDescription(mChartVolume, "成交量 " + hisData.getVol());
Expand Down Expand Up @@ -423,7 +423,7 @@ private void initChartVolumeData() {
HisData t = mData.get(i);
barEntries.add(new BarEntry(i, (float) t.getVol(), t));
}
int maxCount = INIT_COUNT_K;
int maxCount = MAX_COUNT;
if (!mData.isEmpty() && mData.size() < maxCount) {
for (int i = mData.size(); i < maxCount; i++) {
paddingEntries.add(new BarEntry(i, 0));
Expand All @@ -436,10 +436,11 @@ private void initChartVolumeData() {
combinedData.setData(barData);
mChartVolume.setData(combinedData);

mChartVolume.setVisibleXRange(MAX_COUNT_K, MIN_COUNT_K);
mChartVolume.setVisibleXRange(MAX_COUNT, MIN_COUNT);

mChartVolume.notifyDataSetChanged();
mChartVolume.moveViewToX(combinedData.getEntryCount());
// mChartVolume.moveViewToX(combinedData.getEntryCount());
moveToLast(mChartVolume);

}

Expand All @@ -454,7 +455,7 @@ private void initChartMacdData() {
difEntries.add(new Entry(i, (float) t.getDif()));
deaEntries.add(new Entry(i, (float) t.getDea()));
}
int maxCount = INIT_COUNT_K;
int maxCount = MAX_COUNT;
if (!mData.isEmpty() && mData.size() < maxCount) {
for (int i = mData.size(); i < maxCount; i++) {
paddingEntries.add(new BarEntry(i, 0));
Expand All @@ -469,25 +470,26 @@ private void initChartMacdData() {
combinedData.setData(lineData);
mChartMacd.setData(combinedData);

mChartMacd.setVisibleXRange(MAX_COUNT_K, MIN_COUNT_K);
mChartMacd.setVisibleXRange(MAX_COUNT, MIN_COUNT);

mChartMacd.notifyDataSetChanged();
mChartMacd.moveViewToX(combinedData.getEntryCount());
// mChartMacd.moveViewToX(combinedData.getEntryCount());
moveToLast(mChartMacd);
}

private void initChartKdjData() {
ArrayList<Entry> kEntries = new ArrayList<>(MAX_COUNT_K);
ArrayList<Entry> dEntries = new ArrayList<>(MAX_COUNT_K);
ArrayList<Entry> jEntries = new ArrayList<>(MAX_COUNT_K);
ArrayList<Entry> paddingEntries = new ArrayList<>(MAX_COUNT_K);
ArrayList<Entry> kEntries = new ArrayList<>(INIT_COUNT);
ArrayList<Entry> dEntries = new ArrayList<>(INIT_COUNT);
ArrayList<Entry> jEntries = new ArrayList<>(INIT_COUNT);
ArrayList<Entry> paddingEntries = new ArrayList<>(INIT_COUNT);

for (int i = 0; i < mData.size(); i++) {
kEntries.add(new Entry(i, (float) mData.get(i).getK()));
dEntries.add(new Entry(i, (float) mData.get(i).getD()));
jEntries.add(new Entry(i, (float) mData.get(i).getJ()));
}
if (!mData.isEmpty() && mData.size() < INIT_COUNT_K) {
for (int i = mData.size(); i < INIT_COUNT_K; i++) {
if (!mData.isEmpty() && mData.size() < MAX_COUNT) {
for (int i = mData.size(); i < MAX_COUNT; i++) {
paddingEntries.add(new Entry(i, (float) mData.get(mData.size() - 1).getK()));
}
}
Expand All @@ -502,12 +504,13 @@ private void initChartKdjData() {
combinedData.setData(lineData);
mChartKdj.setData(combinedData);

mChartMacd.setVisibleXRange(MAX_COUNT_K, MIN_COUNT_K);
mChartMacd.setVisibleXRange(MAX_COUNT, MIN_COUNT);

mChartKdj.notifyDataSetChanged();
mChartKdj.moveViewToX(combinedData.getEntryCount());
moveToLast(mChartKdj);
}


/**
* according to the price to refresh the last data of the chart
*/
Expand Down Expand Up @@ -612,10 +615,10 @@ public void addData(HisData hisData) {
mChartKdj.getXAxis().setAxisMaximum(mChartKdj.getData().getXMax() + 1.5f);


mChartPrice.setVisibleXRange(MAX_COUNT_K, MIN_COUNT_K);
mChartVolume.setVisibleXRange(MAX_COUNT_K, MIN_COUNT_K);
mChartMacd.setVisibleXRange(MAX_COUNT_K, MIN_COUNT_K);
mChartKdj.setVisibleXRange(MAX_COUNT_K, MIN_COUNT_K);
mChartPrice.setVisibleXRange(MAX_COUNT, MIN_COUNT);
mChartVolume.setVisibleXRange(MAX_COUNT, MIN_COUNT);
mChartMacd.setVisibleXRange(MAX_COUNT, MIN_COUNT);
mChartKdj.setVisibleXRange(MAX_COUNT, MIN_COUNT);

mChartPrice.notifyDataSetChanged();
mChartPrice.invalidate();
Expand Down Expand Up @@ -648,38 +651,9 @@ private void setOffset() {
mChartVolume.setViewPortOffsets(0, 0, 0, bottom);
mChartMacd.setViewPortOffsets(0, 0, 0, bottom);
mChartKdj.setViewPortOffsets(0, 0, 0, bottom);
/*float lineLeft = mChartPrice.getViewPortHandler().offsetLeft();
float barLeft = mChartVolume.getViewPortHandler().offsetLeft();
float lineRight = mChartPrice.getViewPortHandler().offsetRight();
float barRight = mChartVolume.getViewPortHandler().offsetRight();
float offsetLeft, offsetRight;
if (barLeft < lineLeft) {
offsetLeft = Utils.convertPixelsToDp(lineLeft - barLeft);
mChartVolume.setExtraLeftOffset(offsetLeft);
} else {
offsetLeft = Utils.convertPixelsToDp(barLeft - lineLeft);
mChartPrice.setExtraLeftOffset(offsetLeft);
}
if (barRight < lineRight) {
offsetRight = Utils.convertPixelsToDp(lineRight);
mChartVolume.setExtraRightOffset(offsetRight);
} else {
offsetRight = Utils.convertPixelsToDp(barRight);
mChartPrice.setExtraRightOffset(offsetRight);
}*/

}


/**
* set the count of k chart
*/
public void setCount(int init, int max, int min) {
INIT_COUNT_K = init;
MAX_COUNT_K = max;
MIN_COUNT_K = min;
}

/**
* add limit line to chart
*/
Expand Down Expand Up @@ -718,6 +692,5 @@ public void onAxisChange(BarLineChartBase chart) {
hisData.getMacd(), hisData.getDea(), hisData.getDif()));
setDescription(mChartKdj, String.format(Locale.getDefault(), "K:%.2f D:%.2f J:%.2f",
hisData.getK(), hisData.getD(), hisData.getJ()));

}
}
Loading

0 comments on commit ab8f535

Please sign in to comment.