MPAndroidChart设置中心垂直线

12

我想在 LineChart 中心设置一条垂直线,就像这样:

enter image description here

当滚动到每个点时,它可以通知下方(橙色日期字段)更改日期。并且可以通过单击箭头按钮在程序上向左或向右移动。

目前,我可以使用以下代码设置视口并允许中心移动:

LineData data = new LineData(xVals, dataSets);
mChart.setScaleMinima((float) data.getXValCount() / 7f, 1f);
mChart.moveViewTo(0, 7, YAxis.AxisDependency.LEFT);

然后获得结果:

在此输入图片描述

我该如何绘制和设置像上面那样的垂直线?

更新:

对于监听器,我认为OnChartGestureListeneronChartTranslate(MotionEvent me, float dX, float dY)可能有所帮助。我需要的是两个点之间的距离以及如何计算当前视图窗口中有多少个点。有人知道吗?


您可以使用FrameLayout添加类似第一张图片的行。 - activesince93
@activesince93,如何使其居中,并且我如何知道每个节点何时滚动到此行? - ductran
@Kanagalingam,您应该阅读维基 https://github.com/PhilJay/MPAndroidChart/wiki/Interaction-with-the-Chart 尝试调试以找出问题所在,它可能是 onChartGestureEndonChartTranslate,我记得。 - ductran
@R4j 谢谢,当我们从图表中抬起手指时,onChartGestureEnd会被调用,而onChartTranslate即使滚动结束后也会被调用。我卡在这里了。我想在滚动事件结束后获取可见的ViewPortHandler值。有什么想法吗?非常感谢。 - Kanagalingam
@Kanagalingam 我认为你可以在这些事件中使用 handler 来进行延迟。 - ductran
显示剩余4条评论
3个回答

6
你尝试过在图表上使用 getEntryByTouchPoint 方法吗?只需提供图表中心的 x 和 y 坐标即可返回被触摸位置显示的 Entry 对象。

我将这个方法与 onChartTranslate 事件结合使用,它可以正常工作。但是当我尝试滚动到第一个和最后一个条目时出现了问题。这些条目无法移动到中心线,但是 getEntryByTouchPoint 仍然返回它们。 - ductran
@R4j 在这种情况下我能想到的唯一选择就是在第一个真实数据点之前和最后一个之后添加“假”的或空的Entry或xVals。请参考此帖子以获取示例:http://stackoverflow.com/questions/33619679/make-line-chart-with-values-and-dates/33619941#33619941 - Cory Charlton

5

看一下这个方法

protected void drawGridBackground(Canvas c) {

在BarLineChartBase类中(LineChart的父类),你可以使用该方法获取绘制线条所需的所有数据。 类似于这样:

RectF rectF = mViewPortHandler.getContentRect();
float xMiddle = (rectF.right - rectF.left)/2;
Paint p = new Paint();
p.setColor(Color.BLACK);
c.drawLine(xMiddle, rectF.bottom, xMiddle, rectF.top, p);

谢谢。这条线是在点图表下面绘制的,而不是上面。最大的问题是我不知道如何监听当滚动点超过这条垂直线时。你有什么建议吗? - ductran
如果您需要在数据下方绘制一条线,可以在XAxisRender类的renderGridLines(Canvas c)方法中完成。只需将上述代码添加到该方法的末尾即可。关于监听器的其他部分我无法回答。如果我找到答案,我会写信告诉您。 - Lanitka

3
也许已经有点晚了,但这是我的答案。它使用 Swift 编码,并使用 Charts(MPAndroidCharts 的 iOS 端口),但 API 99% 相同 ;)
let verticalPointEntry = ChartDataEntry(x: xValue, y: yValue)

let dataSet = LineChartDataSet(values: [verticalPointEntry], label: "")
dataSet.drawCirclesEnabled = false
dataSet.drawValuesEnabled = false
dataSet.setDrawHighlightIndicators(true)
dataSet.drawHorizontalHighlightIndicatorEnabled = false
dataSet.highlightColor = UIColor.white
dataSet.highlightLineWidth = 1   

let highlightPoint = Highlight(x: xValue, y: yValue, dataSetIndex: datasetIndex)
self.highlightValues([highlightPoint])

// "yourNormalDataSet" is your regular dataSet in which you want to display vertical line over it
let chartData = LineChartData(dataSets: [yourNormalDataSet, dataSet])
self.data = chartData
self.data?.notifiyDataChanged()
self.notifyDataSetChanged

这将在由你的xValue变量定义的点上显示一条垂直线。

希望能对你有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接