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:
Che cosa si intende per "passare questo foro per drawable"? Vuoi il tuo drawable invece del CircleHole? – Paamand
Hai trovato una soluzione per modificare l'evidenziazione drawable? – Massimo
@Massimo si prega di vedere la mia risposta aggiornata che include il codice di esempio –