package com.github.mikephil.charting.utils; import android.content.Context; import android.graphics.Canvas; import android.view.LayoutInflater; import android.view.View; import android.widget.RelativeLayout; import com.github.mikephil.charting.data.Entry; /** * View that can be displayed when selecting values in the chart. Extend this * class to provide custom layouts for your markers. * * @author Philipp Jahoda */ public abstract class MarkerView extends RelativeLayout { /** * Constructor. Sets up the MarkerView with a custom layout resource. * * @param context * @param layoutResource the layout resource to use for the MarkerView */ public MarkerView(Context context, int layoutResource) { super(context); setupLayoutResource(layoutResource); } /** * Sets the layout resource for a custom MarkerView. * * @param layoutResource */ private void setupLayoutResource(int layoutResource) { View inflated = LayoutInflater.from(getContext()).inflate(layoutResource, this); inflated.setLayoutParams(new LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); inflated.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); // measure(getWidth(), getHeight()); inflated.layout(0, 0, inflated.getMeasuredWidth(), inflated.getMeasuredHeight()); } /** * Draws the MarkerView on the given position on the screen with the given * Canvas object. * * @param canvas * @param posx * @param posy */ public void draw(Canvas canvas, float posx, float posy) { // take offsets into consideration posx += getXOffset(); posy += getYOffset(); // translate to the correct position and draw canvas.translate(posx, posy); draw(canvas); canvas.translate(-posx, -posy); } /** * This method enables a specified custom MarkerView to update it's content * everytime the MarkerView is redrawn. * * @param e The Entry the MarkerView belongs to. This can also be any * subclass of Entry, like BarEntry or CandleEntry. * @param dataSetIndex the index of the DataSet the selected value is in */ public abstract void refreshContent(Entry e, int dataSetIndex); /** * Use this to return the desired offset you wish the MarkerView to have on * the x-axis. By returning -(getWidth() / 2) you will center the MarkerView * horizontally. * * @return */ public abstract int getXOffset(); /** * Use this to return the desired position offset you wish the MarkerView to * have on the y-axis. By returning -getHeight() you will cause the * MarkerView to be above the selected value. * * @return */ public abstract int getYOffset(); // /** // * Set the position offset of the MarkerView. By default, the top left // edge // * of the MarkerView is drawn directly where the selected value is at. In // * order to change that, offsets in pixels can be defined. Default offset // is // * zero (0f) on both axes. For offsets dependent on the MarkerViews width // * and height, use getMeasuredWidth() / getMeasuredHeight(). // * // * @param x // * @param y // */ // public void setOffsets(float x, float y) { // this.mXOffset = x; // this.mYOffset = y; // } // // /** // * returns the x-offset that is set for the MarkerView // * // * @return // */ // public float getXOffset() { // return mXOffset; // } // // /** // * returns the y-offset that is set for the MarkerView // * // * @return // */ // public float getYOffset() { // return mYOffset; // } }