MarkerView从图表中移出图表中的最后一个点

Arj*_*sar 11 charts android mpandroidchart

我正在使用MarkerView类在图表中显示标记视图.我创建的markerview布局包含两个textview,一个在另一个之下.

我面临的问题是图表上最后一点的标记视图是图表中的一半,图表外的一半.下面的两张图片清楚地说明了问题:

第一张图显示了图表中心点的标记视图,显示没有任何问题:

在此输入图像描述

第二个图像,如下所示,显示图表最后一个点的标记视图,它是图表中的一半.

在此输入图像描述

如何调整此标记视图以使其在图表区域中显示.

维基没有说明标记视图的任何自定义.还有更多自定义吗?

此外,如果是多线图,如果我只点击其中一个线点,则markerview没有问题.但是,如果我在另一行的任何点上单击标记视图,则应用程序将失败.知道为什么会这样.

markerview类的代码如下:

public class TooltipView extends MarkerView {

private BaseGraphMetadata mBaseGraphMetadata;

private TextView mTooltipDate, mTooltipValue;

public TooltipView(Context context, int layoutResource, BaseGraphMetadata baseGraphMetadata) {
    super(context, layoutResource);
    mTooltipDate = (TextView)findViewById(R.id.tooltip_date);
    mTooltipValue = (TextView)findViewById(R.id.tooltip_value);
    mBaseGraphMetadata = baseGraphMetadata;
}

@Override
public void refreshContent(Entry entry, int i) {
    List<DrillDownInfo> drillDownInfoList = (List<DrillDownInfo>) entry.getData();
    DrillDownInfo drillDownInfo = drillDownInfoList.get(i);
    Map<String, String> group = drillDownInfo.getGroupByNameVsGroupByValue();
    Iterator iterator = group.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry pair = (Map.Entry)iterator.next();
        if(pair.getKey()!=null && pair.getValue()!=null) {
            String key = (String) pair.getKey();
            key = key.toUpperCase();
            Double value = Double.parseDouble((String) pair.getValue());
            String formattedValue = mBaseGraphMetadata.getDataFormatter().getFormattedValue(value);
            mTooltipDate.setText(key + " : " + formattedValue);
        }
        iterator.remove();
    }
    mTooltipValue.setText(String.valueOf("VALUE : "+entry.getVal()));
}

@Override
public int getXOffset() {
    return -(getWidth() / 2);
}

@Override
public int getYOffset() {
    return -getHeight();
}
}
Run Code Online (Sandbox Code Playgroud)

小智 10

我找到了一个解决这个问题的简单方法.您需要在自定义标记视图中设置图表,如下所示:

setChartView(chart);
Run Code Online (Sandbox Code Playgroud)

..并覆盖draw方法,如下所示:

@Override
public void draw(Canvas canvas, float posX, float posY) {
    super.draw(canvas, posX, posY);
    getOffsetForDrawingAtPoint(posX, posY);
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ues 7

以来

android:clipChildren="false"
android:clipToPadding="false"
Run Code Online (Sandbox Code Playgroud)

不适合我,我最终创造了3个不同的drawables.根据Entry索引,我使用其中一个.并且,为了保持箭头居中,XOffset会相应地改变.我想这是一个非常具体的解决方案,但这个想法是可以出口的

  @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);
  }
Run Code Online (Sandbox Code Playgroud)

这是结果

在此输入图像描述 在此输入图像描述 在此输入图像描述

drawables从MPAndroidChart样本中复制,转换为9.patch并根据我的需要进行调整.将它们放在drawable-nodpi中

在此输入图像描述 在此输入图像描述 在此输入图像描述


Phi*_*oda 5

只需在您的MarkerView. 如果突出显示最后一个值,则该getXOffset()方法应返回不同的内容。

返回的内容是在refreshContent(...)方法中计算的。

另外,您还可以查看以下 xml 属性:

android:clipChildren="false"
android:clipToPadding="false"
Run Code Online (Sandbox Code Playgroud)

应该为图表视图设置哪个。

  • 这两个 XML 属性没有帮助。 (4认同)

Vir*_*uss 5

有点晚了,但这是我解决这个问题的简单方法.

您需要Overridedraw您的自定义的方法MarkerView.

然后你就可以控制你的posx不会从你的一个边界关闭(从0右边到位置,取决于你的屏幕尺寸,作为300我自己屏幕的一个例子).

一个简单的例子:

@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);
        }
Run Code Online (Sandbox Code Playgroud)

在这里,我可以控制我的x位置,同时确保标记始终位于图形的顶部(如果你不想要它,请使用p osy += getYOffset();代替)