【发布时间】:2019-03-09 11:38:38
【问题描述】:
我已经尝试了几个小时,在条形图中添加图像。目的是在图表中的每个条形上方放置一个图像。我正在使用 MPAndroidChart 库来绘制我的图表。目前我正在绘制一个风条形图,代码和输出如下。
private void setupBarChartWind(Forecast forecast)
{
BarChart chart = findViewById(R.id.barchart_wind);
chart.setVisibility(View.INVISIBLE);
List<BarEntry> entries = new ArrayList<BarEntry>();
String[] array = new String[NUM_HOURS];
for (int i=0;i<NUM_HOURS;i++) {
entries.add(new BarEntry(i,forecast.getHourly().getDataPoints().get(i).getWindSpeed().floatValue()));
Date date=new Date(forecast.getHourly().getDataPoints().get(i).getTime().getTime());
SimpleDateFormat df2 = new SimpleDateFormat("HH:mm a");
array[i] = df2.format(date);
}
int color = ContextCompat.getColor(getApplication(), R.color.white);
int color_transparent = ContextCompat.getColor(getApplication(), R.color.transparent_100);
mdataSet = new BarDataSet(entries, "Wind"); // add entries to dataset
mdataSet.setColor(color);
mdataSet.setValueTextColor(color_transparent);
BarData lineData = new BarData(mdataSet);
chart.setData(lineData);
chart.setBackgroundColor(getResources().getColor(R.color.transparent_weather_50));
chart.animate();
XAxis xAxis = chart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setTextSize(10f);
xAxis.setTextColor(Color.WHITE);
xAxis.setLabelCount(6);
xAxis.setValueFormatter(new MyXAxisValueFormatter(array));
YAxis yAxis = chart.getAxisLeft();
yAxis.setTextSize(12f); // set the text size
yAxis.setTextColor(Color.WHITE);
yAxis.setGranularity(1f); // interval 1
chart.getDescription().setText("Wind");
chart.getData().setHighlightEnabled(false);
chart.setVisibility(View.VISIBLE);
chart.getXAxis().setDrawGridLines(false);
chart.getAxisLeft().setDrawGridLines(false);
chart.getAxisRight().setDrawGridLines(false);
chart.animateX(2000);
chart.invalidate();
}
我找到了几个链接:MPAndroidChart: add custom image inside bars ,
How do MPAndroidChart renderers work and how do I write a custom renderer? 并尝试从上述资源中阅读有关渲染如何工作的文档,我编写了以下代码来实现所需的行为。
public class BarChartImageRenderer extends BarChartRenderer {
private final Bitmap imageToRender;
public BarChartImageRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler, Bitmap imageToRender) {
super(chart, animator, viewPortHandler);
this.imageToRender=imageToRender;
}
@Override
protected void drawDataSet(Canvas c, IBarDataSet dataSet, int index) {
super.drawDataSet(c, dataSet, index);
drawBarImages(c, dataSet, index);
}
protected void drawBarImages(Canvas c, IBarDataSet dataSet, int index) {
BarBuffer buffer = mBarBuffers[index];
float left;
float right;
float top;
float bottom;
for (int j = 0; j < buffer.buffer.length * mAnimator.getPhaseX(); j += 4) {
left = buffer.buffer[j];
right = buffer.buffer[j + 2];
top = buffer.buffer[j + 1];
bottom = buffer.buffer[j + 3];
float x = (left + right) / 2f;
if (!mViewPortHandler.isInBoundsRight(x))
break;
if (!mViewPortHandler.isInBoundsY(top)
|| !mViewPortHandler.isInBoundsLeft(x))
continue;
BarEntry entry = dataSet.getEntryForIndex(j / 4);
float val = entry.getY();
final Bitmap scaledBarImage = scaleBarImage(buffer,imageToRender);
int starWidth = scaledBarImage.getWidth();
int starOffset = starWidth / 2;
drawImage(c, scaledBarImage, x - starOffset, top);
}
}
private Bitmap scaleBarImage(BarBuffer buffer, Bitmap image) {
float firstLeft = buffer.buffer[0];
float firstRight = buffer.buffer[2];
int firstWidth = (int) Math.ceil(firstRight - firstLeft);
return Bitmap.createScaledBitmap(image, firstWidth, firstWidth, false);
}
protected void drawImage(Canvas c, Bitmap image, float x, float y) {
if (image != null) {
c.drawBitmap(image, x, y, null);
}
}
}
但不幸的是,我不断收到以下错误:
2019-03-09 13:31:55.555 13955-13955/com.example.homeactivity E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.homeactivity, PID: 13955
java.lang.NullPointerException: Attempt to read from null array
at com.github.mikephil.charting.renderer.BarChartRenderer.drawDataSet(BarChartRenderer.java:138)
at com.example.homeactivity.Trending.TrendingActivity$BarChartImageRenderer.drawDataSet(TrendingActivity.java:447)
at com.github.mikephil.charting.renderer.BarChartRenderer.drawData(BarChartRenderer.java:82)
at com.github.mikephil.charting.charts.BarLineChartBase.onDraw(BarLineChartBase.java:237)
我似乎无法弄清楚为什么它不断抛出空数组错误?任何关于我如何解决这个问题的指针都将不胜感激......
【问题讨论】:
标签: java android bar-chart mpandroidchart