MarkerView goes out of the chart for the last point on the chart
Since
android:clipChildren="false"
android:clipToPadding="false"
did not work for me, I ended up creating 3 different drawables. Depending on the Entry index, I use one or the other. And, in order to keep the arrow centered, the XOffset changes accordingly. I guess it's a very specific solution, but the idea is exportable
@Override
public void refreshContent(Entry e, int dataSetIndex) {
if (e.getXIndex() < 4) {
xOffsetMultiplier = 3.2f;
tvContent.setBackgroundResource(R.drawable.stats_marker_left_side);
} else if (e.getXIndex() > mTimestamps.length - 6) {
//timestamps is an array containing xValues timestamps
xOffsetMultiplier = 1.12f;
tvContent.setBackgroundResource(R.drawable.stats_marker_right_side);
} else {
xOffsetMultiplier = 2;
tvContent.setBackgroundResource(R.drawable.stats_marker);
}
tvContent.setText(createMarkerViewText(e));
}
@Override
public int getXOffset() {
// this will center the marker-view horizontally
return (int) -(getWidth() / xOffsetMultiplier);
}
This is the result
The drawables are copied from MPAndroidChart samples, transformed to 9.patch and adapted to my needs. Place them inside drawable-nodpi
A bit late, but here is my easy solution for this problem.
You need to Override
the draw
method of your custom MarkerView
.
You just have then to control that you posx is not going to close from one of your border (from 0
for the right side to location depending on your screen size, as an example 300
for my own screen).
A simple example:
@Override
public void draw(Canvas canvas, float posx, float posy)
{
// take offsets into consideration
posx += getXOffset();
posy=0;
// AVOID OFFSCREEN
if(posx<45)
posx=45;
if(posx>265)
posx=265;
// translate to the correct position and draw
canvas.translate(posx, posy);
draw(canvas);
canvas.translate(-posx, -posy);
}
Here, I can control my x position while ensuring that the marker remain always on the top of the graph (If you dont want it, use posy += getYOffset();
instead)
I have found a simple solution to this issue. You need to set chart in your custom marker view as below:
setChartView(chart);
..and override the draw method as below:
@Override
public void draw(Canvas canvas, float posX, float posY) {
super.draw(canvas, posX, posY);
getOffsetForDrawingAtPoint(posX, posY);
}