【问题标题】:Android aChartEngine XY ChartAndroid aChartEngine XY 图表
【发布时间】:2023-03-14 03:44:01
【问题描述】:

我正在为 Android 使用 aChartEngine 的 0.7.0 图表库。我有一个工作 XY 图表,当收到新数据时,它大约每秒动态变化。但是,它从左到右绘制折线图并最终移出视图。查看正在绘制的新数据的唯一方法是向右滚动图表视图。

有谁知道如何让线条在左侧绘制新数据,以便旧数据最终滚动到视图之外。基本上,反转图表线的方向?

【问题讨论】:

    标签: achartengine


    【解决方案1】:

    我的代码:

     private XYMultipleSeriesDataset HRDataset = new XYMultipleSeriesDataset();
     private XYMultipleSeriesRenderer HeartRateRenderer = new XYMultipleSeriesRenderer();
     private XYSeries HRCurrentSeries;
     private GraphicalView HRChartView;
    

    在 onResume() 中:

      if (HRChartView == null) {
            LinearLayout layout = (LinearLayout) findViewById(R.id.HRchart);
            HRChartView = ChartFactory.getLineChartView(this, HRDataset, HeartRateRenderer);
    
            layout.addView(HRChartView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
           // boolean enabled = HRDataset.getSeriesCount() > 0;
          //  setSeriesEnabled(enabled);
          } else {
            HRChartView.repaint();
          }
    

    在 onCreate() 中:

        HeartRateRenderer.setAxisTitleTextSize(16);
        HeartRateRenderer.setChartTitleTextSize(20);
        HeartRateRenderer.setLabelsTextSize(15);
        HeartRateRenderer.setLegendTextSize(15);
        HeartRateRenderer.setMargins(new int[] {20, 30, 15, 0});
        HeartRateRenderer.setAxesColor(Color.YELLOW);
    
        String seriesTitle = "Heart Rate";
        XYSeries series = new XYSeries(seriesTitle);
    
        HRDataset.addSeries(series);
        HRCurrentSeries = series;
    
        XYSeriesRenderer renderer = new XYSeriesRenderer();
        renderer.setColor(Color.RED);
        HeartRateRenderer.addSeriesRenderer(renderer);      
    

    我有一项从蓝牙设备接收数据的服务。当新数据到达时,我调用这个函数:

    public void setupHRChart(double x, double y)
    {
    
        HRCurrentSeries.add(x, y);
    
    
        if (HRChartView != null) {
            HRChartView.repaint();
        }
    
    }
    

    在清单中:

       <activity android:name="org.achartengine.GraphicalActivity" />
    

    在我的布局中:

       <LinearLayout android:id="@+id/HRchart" android:orientation="horizontal"
        android:layout_width="fill_parent" android:layout_height="300px"  android:layout_weight="1" />
    

    -希望有所帮助。

    【讨论】:

    • 感谢 Damon,这对我帮助很大。
    • @Damon:你能帮我实现“收到新数据时每秒动态变化的 XY 图表”。
    【解决方案2】:

    我实际上决定采用 aChartEngine 的动态折线图的自然流向。我能够锁定图形图像,这样线条就不会再从屏幕上滚出。我还从系列的开头删除了项目,以保持一定的时间跨度可见,而不会将图形压缩成大量线条。它实际上工作得很好。

    这是一个演示图表的 youtube 视频:http://www.youtube.com/watch?v=mZMrOc5QaG0

    【讨论】:

    • 你如何能够将你的 x 轴从右向左移动。请指导我。
    【解决方案3】:

    我还删除了系列开头的项目以保持一定的时间跨度可见

    这个解决方案的问题是你实际上丢失了数据......

    如何使用渲染器的setXAxisMax和setXAxisMin如下:

    0) 将 XAxisMax 设置为一个值,例如 10,并将 XAxisMin 值设置为 0

    1) 计算 xTick 变量中的“刻度”

    2) 一旦 xTick > XAxisMax:

    2.1) 将 XAxisMax 设置为 xTick

    2.2) 将 XAxisMin 设置为原来的值 + 1

    3) 再次渲染图表

    这样我们实际上移动了图表的“可见部分”(通过使用 Xmin 和 Xmax)但不会丢失任何数据(即,我们仍然可以滚动查看以前的数据点):

    renderer.setXAxisMin(0.0);
    renderer.setXAxisMax(10);
    xTick = 0;
    lastMinX = 0;   
    private void refreshChart(double lastValue) {
    /* check if we need to shift the x axis */
        if (xTick > getRenderer().getXAxisMax()) {
            getRenderer().setXAxisMax(xTick);
            getRenderer().setXAxisMin(++lastMinX);
        }
        series.add(xTick++, lastValue);
        mChartView.repaint();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多