MPAndroidChart MarkerView 在固定位置
Posted
技术标签:
【中文标题】MPAndroidChart MarkerView 在固定位置【英文标题】:MPAndroidChart MarkerView in fixed position 【发布时间】:2016-08-25 14:00:07 【问题描述】:有没有办法让 MarkerView 有固定的位置?我需要将它固定在左上角或右上角角。
【问题讨论】:
【参考方案1】:您应该创建一个自定义 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;
【讨论】:
它的工作,但它总是在一个位置,但我需要在左右显示 MarkView,如果手指指向左边,那么 MarkView 在右边位置或右边的点然后左边的MarkView,请给点建议。【参考方案2】:这是将标记固定在左上角或右上角的一种方法
创建自定义 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 的值设置为外观和感觉最佳的值。
希望这会有所帮助!
【讨论】:
【参考方案3】: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;
【讨论】:
完美,非常感谢!【参考方案4】: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 时有效。
【讨论】:
以上是关于MPAndroidChart MarkerView 在固定位置的主要内容,如果未能解决你的问题,请参考以下文章
iOS 图表子类 Markerview 使用 Swift 总是在“xxx-Swift.h”中构建错误