2015-07-03 17 views
9

Utilizzo la libreria di grafici MPAndroid per disegnare il grafico a linee nella mia app per Android. Lo stato del grafo è come: MPAndroidChart - Line ChartMPAndroidChart LineChart evidenziabile personalizzato drawable

voglio cambiare in questo modo:

Line Chart

quindi voglio cambiare i punti di MPAnroid Linea Grafico, TS denominata "Circle Hole" in libreria. Voglio passare questo buco a disegnabile. C'è un modo in cui posso farlo?

Il codice cambiamento buco cerchio è qui:

LineDataSet set1 = new LineDataSet(yVals, "DataSet 1"); 
set1.setDrawCircleHole(true); 
set1.setCircleColor(Color.BLACK); 

riferimento Library è qui: MPAndroidChart

+0

Che cosa si intende per "passare questo foro per drawable"? Vuoi il tuo drawable invece del CircleHole? – Paamand

+0

Hai trovato una soluzione per modificare l'evidenziazione drawable? – Massimo

+0

@Massimo si prega di vedere la mia risposta aggiornata che include il codice di esempio –

risposta

6

Dalla versione 3.0 è possibile fornire l'immagine personalizzata che verrà visualizzata sulla selezione di un determinato punto sulla grafico. Le istruzioni riportate di seguito sono secondo the wiki

In sintesi, è ora possibile utilizzare la classe chiamata MarkerImage:

MarkerImage myMarkerImage = new MarkerImage(this, R.drawable.my_drawable); 

Poi:

myChart.setMarker(myMarkerImage); 

Per regolare la posizione dell'immagine, è possibile chiamare :

setOffset(float x, float y); 

Se non si desidera utilizzare MarkerView, probabilmente dovresti creare la sottoclasse di LineChartRenderer e aggiungere la logica per disegnare il tuo evidenziatore personalizzato.

Qui è una prova molto di base del concetto:

import android.graphics.Bitmap; 
import android.graphics.Canvas; 

import com.github.mikephil.charting.animation.ChartAnimator; 
import com.github.mikephil.charting.charts.LineChart; 
import com.github.mikephil.charting.data.Entry; 
import com.github.mikephil.charting.data.LineData; 
import com.github.mikephil.charting.highlight.Highlight; 
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; 
import com.github.mikephil.charting.renderer.LineChartRenderer; 
import com.github.mikephil.charting.utils.Transformer; 
import com.github.mikephil.charting.utils.ViewPortHandler; 

import java.util.List; 

/** 
* Created by David on 3/01/2017. 
*/ 

public class ImageLineChartRenderer extends LineChartRenderer { 

    private final LineChart lineChart; 
    private final Bitmap image; 

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

    @Override 
    public void drawExtras(Canvas c) { 
     super.drawExtras(c); 

     Highlight[] highlighted = lineChart.getHighlighted(); 
     if (highlighted == null) return; 

     float phaseY = mAnimator.getPhaseY(); 

     float[] imageBuffer = new float[2]; 
     imageBuffer[0] = 0; 
     imageBuffer[1] = 0; 
     LineData lineData = mChart.getLineData(); 
     List<ILineDataSet> dataSets = mChart.getLineData().getDataSets(); 

     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 (Highlight high : highlighted) { 
      int dataSetIndex = high.getDataSetIndex(); 
      ILineDataSet set = lineData.getDataSetByIndex(dataSetIndex); 
      Transformer trans = lineChart.getTransformer(set.getAxisDependency()); 

      if (set == null || !set.isHighlightEnabled()) 
       continue; 

      Entry e = set.getEntryForXValue(high.getX(), high.getY()); 

      if (!isInBoundsX(e, set)) 
       continue; 

      imageBuffer[0] = e.getX(); 
      imageBuffer[1] = e.getY() * phaseY; 
      trans.pointValuesToPixel(imageBuffer); 

      c.drawBitmap(scaledBitmaps[dataSetIndex], 
        imageBuffer[0] - scaledBitmapOffsets[dataSetIndex], 
        imageBuffer[1] - scaledBitmapOffsets[dataSetIndex], 
        mRenderPaint); 
     } 
    } 

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

Consumare in questo modo:

Bitmap starBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.star); 
mChart.setRenderer(new ImageLineChartRenderer(mChart, mChart.getAnimator(), mChart.getViewPortHandler(), starBitmap)); 

Spiegazione: drawExtras in LineChartRenderer disegna i cerchi. Li vogliamo ancora, quindi nella nostra sostituzione drawExtras chiamiamo super first. Quindi generiamo una bitmap in scala per ogni DataSet (i DataSet possono avere raggi di cerchio diversi). Ridimensioniamo le immagini bitmap ad una dimensione arbitraria (10 volte il raggio del cerchio). Quindi, iteriamo attraverso le Highlights esposte attraverso il campo LineChart del nostro renderer e disegniamo la bitmap appropriata.

Ecco uno screenshot - è possibile vedere l'immagine bitmap 'stella' al posto del cerchio sull'indice evidenziato:

a line chart with a star instead of a circle at the highlighted point

+1

grazie a @David Rawson, mi salvi! myChart.setMarker (myMarkerImage); non funziona per me, sovrascrive il mio MarkerView, provo la tua prova di base del concetto, funziona, anche se è difficile per me. Grazie. –

+1

Questa domanda per ulteriori informazioni su come scrivere un renderer personalizzato: http: // StackOverflow.it/q/43443787/5241933 –

+0

Era da tanto tempo che condividevi ancora le informazioni, grazie. –

Problemi correlati