【问题标题】:Adding an image inside an MPAndroidChart BarChart?在 MPAndroidChart 条形图中添加图像?
【发布时间】: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


    【解决方案1】:

    我有同样的错误。那是因为我打电话给

    Bitmap starBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.clock);
    chart.setRenderer(new ImageBarChartRenderer(chart, chart.getAnimator(), chart.getViewPortHandler(), starBitmap));
    

    在错误的地方。 如果您将其移至OnCreateView 是否有效?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      相关资源
      最近更新 更多