2017-02-03 26 views
1

Я создал LineChart с помощью библиотеки MPAndroidChart и все отлично работает.Показать изображение вместо круга на LineChart

Теперь то, что я хочу сделать, это показать рисованное (изображение) вместо круга по умолчанию для каждой записи на диаграмме.

Я пробовал так много вариантов из API, но не повезло.

Может ли кто-нибудь сказать мне, как я могу это сделать?

+2

Его невозможно установить на круги. Не с текущей реализацией. Вам нужно углубиться в библиотеку и изменить код библиотеки, если вы хотите сделать чертежи –

+0

OK Спасибо за разъяснение. будет изучать библиотеку. –

+0

Привет, Tushar. Пожалуйста, проверьте этот вопрос, который очень похож. Https://stackoverflow.com/questions/31201874/mpandroidchart-linechart-custom-highlight-drawable –

ответ

4

И, наконец, после попытки так много вещей, с помощью внушения @David Росна и этого пост MPAndroidChart LineChart custom highlight drawable

Я сумел создать пользовательский визуализатор, который заменяет круг изображение по умолчанию в диаграмме с помощью прилагаемого изображения.

Ниже приведен фрагмент кода решения.

class ImageLineChartRenderer extends LineChartRenderer { 
private final LineChart lineChart; 
private final Bitmap image; 


ImageLineChartRenderer(LineChart chart, ChartAnimator animator, ViewPortHandler viewPortHandler, Bitmap image) { 
    super(chart, animator, viewPortHandler); 
    this.lineChart = chart; 
    this.image = image; 
} 

private float[] mCirclesBuffer = new float[2]; 

@Override 
protected void drawCircles(Canvas c) { 
    mRenderPaint.setStyle(Paint.Style.FILL); 
    float phaseY = mAnimator.getPhaseY(); 
    mCirclesBuffer[0] = 0; 
    mCirclesBuffer[1] = 0; 
    List<ILineDataSet> dataSets = mChart.getLineData().getDataSets(); 

    //Draw bitmap image for every data set with size as radius * 10, and store it in scaled bitmaps array 
    Bitmap[] scaledBitmaps = new Bitmap[dataSets.size()]; 
    float[] scaledBitmapOffsets = new float[dataSets.size()]; 
    for (int i = 0; i < dataSets.size(); i++) { 
     float imageSize = dataSets.get(i).getCircleRadius() * 10; 
     scaledBitmapOffsets[i] = imageSize/2f; 
     scaledBitmaps[i] = scaleImage((int) imageSize); 
    } 

    for (int i = 0; i < dataSets.size(); i++) { 
     ILineDataSet dataSet = dataSets.get(i); 

     if (!dataSet.isVisible() || !dataSet.isDrawCirclesEnabled() || dataSet.getEntryCount() == 0) 
      continue; 

     mCirclePaintInner.setColor(dataSet.getCircleHoleColor()); 
     Transformer trans = mChart.getTransformer(dataSet.getAxisDependency()); 
     mXBounds.set(mChart, dataSet); 


     int boundsRangeCount = mXBounds.range + mXBounds.min; 
     for (int j = mXBounds.min; j <= boundsRangeCount; j++) { 
      Entry e = dataSet.getEntryForIndex(j); 
      if (e == null) break; 
      mCirclesBuffer[0] = e.getX(); 
      mCirclesBuffer[1] = e.getY() * phaseY; 
      trans.pointValuesToPixel(mCirclesBuffer); 
      if (!mViewPortHandler.isInBoundsRight(mCirclesBuffer[0])) 
       break; 
      if (!mViewPortHandler.isInBoundsLeft(mCirclesBuffer[0]) || !mViewPortHandler.isInBoundsY(mCirclesBuffer[1])) 
       continue; 

      if (scaledBitmaps[i] != null) { 
       c.drawBitmap(scaledBitmaps[i], 
         mCirclesBuffer[0] - scaledBitmapOffsets[i], 
         mCirclesBuffer[1] - scaledBitmapOffsets[i], 
         mRenderPaint); 
      } 
     } 
    } 

} 


private Bitmap scaleImage(int radius) { 
    return Bitmap.createScaledBitmap(image, radius, radius, false); 
} 

Надеюсь, это поможет кому-то.

+0

Спасибо за фрагмент :). Можно ли добавлять разные изображения в разные точки? –

0

Вы можете просто создать запись с возможностью рисования, и она будет нарисована вместо круга на графике.

new Entry(i, value, drawable)