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)
以来
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中

只需在您的MarkerView. 如果突出显示最后一个值,则该getXOffset()方法应返回不同的内容。
返回的内容是在refreshContent(...)方法中计算的。
另外,您还可以查看以下 xml 属性:
android:clipChildren="false"
android:clipToPadding="false"
Run Code Online (Sandbox Code Playgroud)
应该为图表视图设置哪个。
有点晚了,但这是我解决这个问题的简单方法.
您需要Override将draw您的自定义的方法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();代替)
| 归档时间: |
|
| 查看次数: |
7784 次 |
| 最近记录: |