Skip to content

Instantly share code, notes, and snippets.

@yicone
Last active March 11, 2016 08:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yicone/f2b8306f135b20ad5dd7 to your computer and use it in GitHub Desktop.
Save yicone/f2b8306f135b20ad5dd7 to your computer and use it in GitHub Desktop.
使用 https://github.com/PhilJay/MPAndroidChart 绘制基金净值变化曲线
public class SubjectNetWorthChartResp {
public String label1;
public String label2;
public String label3;
public int xSkipCount;
public List<String> xSet = new ArrayList<>();
public List<Float> ySet1 = new ArrayList<>();
public List<Float> ySet2 = new ArrayList<>();
public List<Float> ySet3 = new ArrayList<>();
}
public Call<SubjectNetWorthChartResp> getSubjectNetWorthChart(@Path("id") int subjectId) {
SubjectNetWorthChartResp resp = new SubjectNetWorthChartResp();
resp.label1 = "南方宝元";
resp.label2 = "沪深300";
resp.label3 = "同类平均";
resp.xSkipCount = 6;
Calendar rightNow = Calendar.getInstance();
Calendar startDate = Calendar.getInstance();
startDate.add(Calendar.MONTH, -1);
// 返回上月同日至今的图标数据
float max = 9.0f;
float min = -3.0f;
Random random = new Random();
for (Date date = startDate.getTime(); startDate.before(rightNow); startDate.add(Calendar.DATE, 1)) {
String strDate = new SimpleDateFormat("MM-dd").format(startDate.getTime());
resp.xSet.add(strDate);
// http://stackoverflow.com/questions/6078157/random-nextfloat-is-not-applicable-for-floats
resp.ySet1.add(random.nextFloat() * (max - min) + min);
resp.ySet2.add(random.nextFloat() * (max - min) + min);
resp.ySet3.add(random.nextFloat() * (max - min) + min);
}
return resp;
}
protected void getChartDataCallback(SubjectNetWorthChartResp resp) {
ArrayList<ILineDataSet> lineDateSets = getDataSet(resp);
LineData lineData = new LineData(resp.xSet, lineDateSets);
chart.setData(lineData);
XAxis xAxis = chart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setLabelsToSkip(resp.xSkipCount);
xAxis.enableGridDashedLine(5f, 5f, 0);
YAxis axisLeft = chart.getAxisLeft();
// 处理Y轴坐标文字格式为 0.00%
axisLeft.setValueFormatter(new MyPercentFormatter());
axisLeft.setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART);
axisLeft.enableGridDashedLine(5f, 5f, 0);
axisLeft.setDrawZeroLine(false);
YAxis axisRight = chart.getAxisRight();
axisRight.setDrawLabels(false);
axisRight.setDrawGridLines(false);
axisRight.setDrawZeroLine(false);
// 自定义YAxisRenderer,为了满足正负值坐标文字不同颜色的需求
MyYAxisRenderer myYAxisRenderer = new MyYAxisRenderer(chart.getViewPortHandler(), axisLeft, chart.getTransformer(YAxis.AxisDependency.LEFT));
chart.setRendererLeftYAxis(myYAxisRenderer);
Legend legend = chart.getLegend();
legend.setPosition(Legend.LegendPosition.BELOW_CHART_RIGHT);
chart.setDescription("");
chart.setNoDataText("暂无数据");
chart.invalidate();
}
private ArrayList<ILineDataSet> getDataSet(SubjectNetWorthChartResp resp) {
ArrayList<ILineDataSet> dataSets = null;
ArrayList<Entry> valueSet1 = new ArrayList<>();
ArrayList<Entry> valueSet2 = new ArrayList<>();
ArrayList<Entry> valueSet3 = new ArrayList<>();
Entry entry;
for (int i = 0; i < resp.ySet1.size(); i++) {
entry = new Entry(resp.ySet1.get(i), i);
valueSet1.add(entry);
}
for (int i = 0; i < resp.ySet2.size(); i++) {
entry = new Entry(resp.ySet2.get(i), i);
valueSet2.add(entry);
}
for (int i = 0; i < resp.ySet3.size(); i++) {
entry = new Entry(resp.ySet3.get(i), i);
valueSet3.add(entry);
}
LineDataSet lineDataSet1 = new LineDataSet(valueSet1, resp.label1);
lineDataSet1.setColor(Color.parseColor("#FE3651"));
lineDataSet1.setDrawValues(false);
lineDataSet1.setDrawCircleHole(false);
lineDataSet1.setDrawCircles(false);
lineDataSet1.setHighlightEnabled(false);
LineDataSet lineDataSet2 = new LineDataSet(valueSet2, resp.label2);
lineDataSet2.setColor(Color.parseColor("#FBB04E"));
lineDataSet2.setDrawValues(false);
lineDataSet2.setDrawCircleHole(false);
lineDataSet2.setDrawCircles(false);
lineDataSet2.setHighlightEnabled(false);
LineDataSet lineDataSet3 = new LineDataSet(valueSet3, resp.label3);
lineDataSet3.setColor(Color.parseColor("#7FA6DD"));
lineDataSet3.setDrawValues(false);
lineDataSet3.setDrawCircleHole(false);
lineDataSet3.setDrawCircles(false);
lineDataSet3.setHighlightEnabled(false);
dataSets = new ArrayList<>();
dataSets.add(lineDataSet1);
dataSets.add(lineDataSet2);
dataSets.add(lineDataSet3);
return dataSets;
}
class MyPercentFormatter extends PercentFormatter{
public MyPercentFormatter(){
mFormat = new DecimalFormat("###,###,##0.00");
}
}
class MyYAxisRenderer extends YAxisRenderer {
public MyYAxisRenderer(ViewPortHandler viewPortHandler, YAxis yAxis, Transformer trans) {
super(viewPortHandler, yAxis, trans);
}
@Override
protected void drawYLabels(Canvas c, float fixedPosition, float[] positions, float offset) {
mAxisLabelPaint.setColor(resColorNumberGreen);
for (int i = 0; i < mYAxis.mEntryCount; i++) {
// 处理Y轴坐标文字的颜色
float v = mYAxis.mEntries[i];
if (v > 0) {
mAxisLabelPaint.setColor(resColorNumberRed);
} else if (v < 0) {
mAxisLabelPaint.setColor(resColorNumberGreen);
} else {
mAxisLabelPaint.setColor(mYAxis.getTextColor());
}
String text = mYAxis.getFormattedLabel(i);
if (!mYAxis.isDrawTopYLabelEntryEnabled() && i >= mYAxis.mEntryCount - 1)
return;
c.drawText(text, fixedPosition, positions[i * 2 + 1] + offset, mAxisLabelPaint);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment