【问题标题】:Synchronized charts or multiple charts like Highcharts in Android同步图表或多个图表,如 Android 中的 Highcharts
【发布时间】:2017-01-04 07:50:05
【问题描述】:

我们如何在Android 中实现Synchronized charts

对于我的网页,我使用了Highcharts API。 Android有没有类似的东西。我检查了here 提到的各种库,但没有找到任何符合要求的库。

我不想要像 thisthis 这样的组合图表。我正在寻找同步图表。

是否有任何库可以满足要求,或者我应该使用webView(这对我来说是最坏的情况)

MPAndroidChart 可以吗?

编辑

结果图表应该像highcharts页面中给出的图表

示例

更新

座右铭不仅仅是绘制 3 个图表。目的是使它们同步。同步意味着所有 3 个图表都具有相同的 x 轴(值),单击这些图表中的任何点时,该特定点的图应在所有图表中突出显示。我确定我没有正确解释。请检查此link 并悬停图表

【问题讨论】:

  • 请指定您要准备哪种类型的图表,我的意思是图像或可以给出适当想法的东西。
  • @DeepPatel 已更新。现在,我正在尝试绘制 2 个折线图,将其放在另一个下方,使用相同的 x 轴数据集并在标记上尝试一些逻辑,我的意思是在任何时候单击。不知道通向哪里。我现在正在尝试
  • 在下面查看我的答案

标签: android charts highcharts mpandroidchart


【解决方案1】:

点击图表 1 时,获取 X 和 Y 点并在图表 2 上突出显示它们。与第二张图表相同。

    lineChart1.setOnChartValueSelectedListener(new OnChartValueSelectedListener()
    {
        @Override
        public void onValueSelected(Entry e, Highlight h)
        {
            lineChart2.highlightValue(e.getX(),e.getY(),0,false);
        }

        @Override
        public void onNothingSelected()
        {
        }
    });


    lineChart2.setOnChartValueSelectedListener(new OnChartValueSelectedListener()
    {
        @Override
        public void onValueSelected(Entry e, Highlight h)
        {
            lineChart1.highlightValue(e.getX(),e.getY(),0,false);
        }

        @Override
        public void onNothingSelected() {
        }
    });

注意 将最后一个参数设置为 false,这样它就不会一次又一次地调用侦听器。如果未设置,则会导致死锁。

【讨论】:

    【解决方案2】:

    sample app 很好地展示了 MPAndroidChart“开箱即用”可用的功能。

    如您所见,ListView 中有多个图表的示例,似乎接近您的要求。

    同样,source code 可在 GitHub 上查看,您可以检查它是否有可用的类和方法,让您可以开箱即用地做您想做的事情。

    同时,您应该明白,仅凭配置就期望找到一个完全适合不寻常要求的库通常是不现实的。免费和开源库通常提供扩展和定制,MPAndroidChart 也不例外。作为一名专业的软件工程师,或者作为一个有抱负的人,你应该愿意并准备好自己编程。

    在您的特定情况下,您似乎想要图表之间的某种协调。因此,如果您单击其中一个,则 MarkerView 会出现在 DataSet 中相同 xIndex 的所有位置上。

    要尝试此操作,您可以先查看OnChartGestureListener 的代码。可以通过event-driven programming获得解决方案。您将设置 OnChartGestureListener 的 3 个实现,它们将使用事件将当前手势传输给中介,然后中介在其他两个图表上触发相同的手势。比如OnChartGestureListener里面有一个方法可以实现,叫做:

    void onChartScale(MotionEvent var1, float var2, float var3);
    

    你的实现应该是这样的:

    @Override
    void onChartScale(MotionEvent var1, float var2, float var3) {
        //transmit event to mediator 
        //handle event for this chart
    }
    

    如果这太难了,那么您将不得不在 WebView 中坚持使用 Highcharts,正如您自己提出的建议一样。但是请注意,WebView 内部的性能不如使用直接渲染到画布的库。

    简而言之,可能使用MPAndroidChart 来完成您想要的事情,但没有“开箱即用”的解决方案可用。

    【讨论】:

    • 我已经完成了获取图表并绘制轴点的工作。但我坚持使用标记。 MPAndroidChart 以前的版本对我来说很方便。现在我真的在努力解决它。但是我知道这项任务需要更多的努力,并且可以在您提供的指导下完成
    • 手势和一切都很好,但是我如何同时调用两个标记实例
    • 我认为您必须在目标图表上使用getHighlighter,然后使用updateHighlighted
    • onValueSelected 内,我得到了我们点击的x 和y 坐标。现在我必须调用一个标记并说它在剩余图表中的这些坐标处显示一个标记。如何手动调用 Marker?
    • 任务完成。 highlightValue 带有所需的参数就可以了
    【解决方案3】:

    您当然可以使用MPAndroidCharts 库。

    Go for 1> Speed 线图(带图例,设计简单) 2> Elevation , Heart

    的 LineChart(立方线)/(渐变填充)

    在使用 gradientFill 时,应用它来消除虚线并绘制一条直线:

        lineDataSet.enableDashedLine(0f, 0f, 0f);
        lineDataSet.enableDashedHighlightLine(0f, 0f, 0f);
    

    【讨论】:

    • 我已经完成了折线图@DeepPatel。我的问题是“如何同步它们”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多