package com.github.mikephil.charting.highlight; import java.util.ArrayList; import java.util.List; import com.github.mikephil.charting.components.YAxis; import com.github.mikephil.charting.data.DataSet; import com.github.mikephil.charting.interfaces.BarLineScatterCandleBubbleDataProvider; import com.github.mikephil.charting.utils.SelectionDetail; import com.github.mikephil.charting.utils.Utils; /** * Created by Philipp Jahoda on 21/07/15. */ public class ChartHighlighter<T extends BarLineScatterCandleBubbleDataProvider> { /** instance of the data-provider */ protected T mChart; public ChartHighlighter(T chart) { this.mChart = chart; } /** * Returns a Highlight object corresponding to the given x- and y- touch positions in pixels. * * @param x * @param y * @return */ public Highlight getHighlight(float x, float y) { int xIndex = getXIndex(x); if (xIndex == -Integer.MAX_VALUE) return null; int dataSetIndex = getDataSetIndex(xIndex, x, y); if (dataSetIndex == -Integer.MAX_VALUE) return null; return new Highlight(xIndex, dataSetIndex); } /** * Returns the corresponding x-index for a given touch-position in pixels. * * @param x * @return */ protected int getXIndex(float x) { // create an array of the touch-point float[] pts = new float[2]; pts[0] = x; // take any transformer to determine the x-axis value mChart.getTransformer(YAxis.AxisDependency.LEFT).pixelsToValue(pts); return (int) Math.round(pts[0]); } /** * Returns the corresponding dataset-index for a given xIndex and xy-touch position in pixels. * * @param xIndex * @param x * @param y * @return */ protected int getDataSetIndex(int xIndex, float x, float y) { List<SelectionDetail> valsAtIndex = getSelectionDetailsAtIndex(xIndex); float leftdist = Utils.getMinimumDistance(valsAtIndex, y, YAxis.AxisDependency.LEFT); float rightdist = Utils.getMinimumDistance(valsAtIndex, y, YAxis.AxisDependency.RIGHT); YAxis.AxisDependency axis = leftdist < rightdist ? YAxis.AxisDependency.LEFT : YAxis.AxisDependency.RIGHT; int dataSetIndex = Utils.getClosestDataSetIndex(valsAtIndex, y, axis); return dataSetIndex; } /** * Returns a list of SelectionDetail object corresponding to the given xIndex. * * @param xIndex * @return */ protected List<SelectionDetail> getSelectionDetailsAtIndex(int xIndex) { List<SelectionDetail> vals = new ArrayList<SelectionDetail>(); float[] pts = new float[2]; for (int i = 0; i < mChart.getData().getDataSetCount(); i++) { DataSet<?> dataSet = mChart.getData().getDataSetByIndex(i); // dont include datasets that cannot be highlighted if (!dataSet.isHighlightEnabled()) continue; // extract all y-values from all DataSets at the given x-index final float yVal = dataSet.getYValForXIndex(xIndex); if (yVal == Float.NaN) continue; pts[1] = yVal; mChart.getTransformer(dataSet.getAxisDependency()).pointValuesToPixel(pts); if (!Float.isNaN(pts[1])) { vals.add(new SelectionDetail(pts[1], i, dataSet)); } } return vals; } }