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;
// }
}