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”中构建错误

iOS 图表子类 Markerview 使用 Swift 总是在“xxx-Swift.h”中构建错误

MPAndroidChart 教程

MPAndroidchart - 烛台图为空白

MPAndroidChart简单使用

无法解决:com.github.PhilJay:MPAndroidChart:v2.1.4