Android круговая диаграмма с иконками между барами - PullRequest
0 голосов
/ 04 февраля 2020

Я хочу создать диаграмму ap ie с изображениями между панелями легенды. Я добавляю скриншот ниже для лучшего понимания, я попытался использовать один холст, а затем создал один ar c и попытался добавить к нему изображения, но он не работал. Сейчас я использую библиотеку диаграмм p ie ниже, чтобы показать столбцы с центральным текстом. Любое предложение будет полезно. Спасибо:)

https://github.com/PhilJay/MPAndroidChart

введите описание изображения здесь

С уважением, Рохит Гарг

1 Ответ

0 голосов
/ 04 февраля 2020

Вы можете сделать это, расширив PieChartRenderer .

Если вы посмотрите на реализацию PieChartRenderer.drawRoundedSlices(Canvas c), вы можете получить пример того, как получить начальные координаты каждого среза.

Затем просто используйте drawBitmap или drawPicture , чтобы визуализировать изображение между кусками p ie. (Я использовал Utils.drawImage в примере, чтобы имитировать c источник PieChartRenderer)

В качестве примера я скопировал drawRoundedSlices и переименовал его drawImageBeforeSlice. Вместо того, чтобы рисовать дуги, я рисую растровые изображения. Чтобы заставить рендерер использовать новый метод, я переопределяю drawExtras и в конце добавляю вызов нового метода.

class PieChartRendererWithImages extends PieChartRenderer
{
  protected Drawable mImage;

  public PieChartRendererWithImages(PieChart chart, ChartAnimator animator, ViewPortHandler viewPortHandler, Drawable image) {
    super(chart, animator, viewPortHandler);
    mImage = image;
  }

  /**
   * This draws an image before all pie-slices
   *
   * @param c
   */
  protected void drawImageBeforeSlice(Canvas c) {

    IPieDataSet dataSet = mChart.getData().getDataSet();

    if (!dataSet.isVisible())
      return;

    float phaseX = mAnimator.getPhaseX();
    float phaseY = mAnimator.getPhaseY();

    MPPointF center = mChart.getCenterCircleBox();
    float r = mChart.getRadius();

    // calculate the radius of the "slice-circle"
    float circleRadius = (r - (r * mChart.getHoleRadius() / 100f)) / 2f;

    float[] drawAngles = mChart.getDrawAngles();
    float angle = mChart.getRotationAngle();

    for (int j = 0; j < dataSet.getEntryCount(); j++) {

      float sliceAngle = drawAngles[j];

      Entry e = dataSet.getEntryForIndex(j);

      // draw only if the value is greater than zero
      if ((Math.abs(e.getY()) > Utils.FLOAT_EPSILON)) {

        float x = (float) ((r - circleRadius)
                * Math.cos(Math.toRadians((angle + sliceAngle)
                * phaseY)) + center.x);
        float y = (float) ((r - circleRadius)
                * Math.sin(Math.toRadians((angle + sliceAngle)
                * phaseY)) + center.y);

        // draw image instead of arcs            
        Utils.drawImage(
                c,
                mImage,
                (int)x,
                (int)y,
                mImage.getIntrinsicWidth(),
                mImage.getIntrinsicHeight());
      }

      angle += sliceAngle * phaseX;
    }
    MPPointF.recycleInstance(center);
  }

  @Override
  public void drawExtras(Canvas c) {
    super.drawExtras(c);
    // use drawImageBeforeSlice in last step of rendering process
    drawImageBeforeSlice(c);
  }
}

Не забудьте установить новый рендерер на вашей круговой диаграмме:

myPieChart.setRenderer(new PieChartRendererWithImages(myPieChart, myPieChart.getAnimator(), myPieChart.getViewPortHandler(), getResources().getDrawable(R.drawable.my_image)));

Проверено для работы, поместив его в пример MPAndroidChart: MPAndroidChart example with custom icons between the slices

...