【问题标题】:MPAndroidChart MarkerView in fixed positionMPAndroidChart MarkerView 在固定位置
【发布时间】:2016-08-25 14:00:07
【问题描述】:

有没有办法让 MarkerView 有固定的位置?我需要将它固定在左上角或右上角角。

【问题讨论】:

    标签: mpandroidchart


    【解决方案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 时有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-30
        • 1970-01-01
        • 2012-01-08
        • 1970-01-01
        • 2023-03-31
        • 2017-09-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多