【发布时间】:2016-08-25 14:00:07
【问题描述】:
有没有办法让 MarkerView 有固定的位置?我需要将它固定在左上角或右上角角。
【问题讨论】:
标签: mpandroidchart
有没有办法让 MarkerView 有固定的位置?我需要将它固定在左上角或右上角角。
【问题讨论】:
标签: mpandroidchart
您应该创建一个自定义 MarkerView,就像在 documentation 中一样。
然后,像这样自定义 getXOffset 和 getYOffset:
@Override
public int getXOffset(float xpos) {
// this will cause the marker-view to be at left of the screen
return -(int)xpos;
}
@Override
public int getYOffset(float ypos) {
// this will cause the marker-view to be at top screen
return -(int)ypos;
【讨论】:
这是将标记固定在左上角或右上角的一种方法
创建自定义 MarkerView 后,您可以执行以下操作。
1) 您可以为父视图/布局设置一个 id,并使用该 id 获取它的宽度。
layoutWidth = customLayout.getWidth();
2) 然后您可以覆盖 draw 并执行以下操作:
@Override
public void draw(Canvas canvas, float posX, float posY) {
if (posX > (canvas.getWidth() / 2.0))
//Check if the user is in the right half of the canvas
super.draw(canvas, leftXPos, leftYPos);
//Draw marker on the left top corner
else
//Otherwise draw the marker on the top right corner.
super.draw(canvas, canvas.getWidth() - layoutWidth, rightYPos);
}
您可以将 leftXPos、leftYPos 和 rightYPos 的值设置为外观和感觉最佳的值。
希望这会有所帮助!
【讨论】:
getXOffset(float xpos) 和 getYOffset(float ypos) 不再被 MarkerView 类覆盖。要修复标记位置,您必须通过以下方式覆盖 getOffsetForDrawingAtPoint(float posX, float posY) 方法:
private MPPointF mOffset;
@Override
public MPPointF getOffsetForDrawingAtPoint(float posX, float posY) {
if(mOffset == null) {
// center the marker horizontally and fixed Y position at the top
mOffset = new MPPointF(-(getWidth() / 2f), -posY);
}
return mOffset;
}
【讨论】:
MpandroidChart v3.1.0:
class MarkerView constructor(
context: Context,
) :
MarkerView(context, R.layout.marker_view) {
private val totalWidth = resources.displayMetrics.widthPixels
override fun refreshContent(e: Entry?, highlight: Highlight?) {
//...
super.refreshContent(e, highlight)
}
override fun getOffsetForDrawingAtPoint(posX: Float, posY: Float): MPPointF {
val supposedX = posX + width
val mpPointF = MPPointF()
mpPointF.x = when {
supposedX > totalWidth -> -width.toFloat()
posX - width < 0 -> 0f
else -> 0f
}
mpPointF.y = if (posY > height)
-height.toFloat()
else
0f
return mpPointF
}
}
在这个实现中MarkerView的默认位置是在点的右上角,如果有足够的空间,否则可能在它的左上角、左下角或右下角 .您可以根据需要更改此行为。
请注意,这仅在图表宽度设置为 MATCH_PARENT 时有效。
【讨论】: