【问题标题】:Android aChartEngine movable Line ChartAndroid aChartEngine 可移动折线图
【发布时间】:2012-12-03 06:12:02
【问题描述】:

我正在使用适用于 Android 的 aChartEngine 的 0.7.0 图表库。谁能帮助我了解如何从左到右绘制折线图并最终移出视图以及如何将图表视图滚动到左侧?

我的代码是....

public class MainActivity extends Activity {

    private GraphicalView view;
    private static Thread thread;
    private TimeSeries dataSet = new TimeSeries("Heart Beat Rate");
    private XYSeriesRenderer renderer = new XYSeriesRenderer();
    private XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset();
    private XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
      @Override
      public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.main);       
              LinearLayout layout_eeg1 = (LinearLayout) findViewById(R.id.chart1);
                view = getView(this);
                layout_eeg1.addView(view,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                thread = new Thread() {
                public void run() {
                    for (int i = 0; i < 200; i++) {
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        } 
                        Point p = getDataFromReciver(i);
                        addNewPoint(p);
                        view.repaint();
                    }
                }
            };
            thread.start(); 

      }      
      private static Point getDataFromReciver(int x) {
        return new Point(x, randomData());
    }

    private static int randomData() {
        Random random = new Random();
        return random.nextInt(180);
    }

    private int x;
    private int y;

    public void Point( int x, int y) {
        this.x = x;
        this.y = y;
    }
    private int getX() {
        return x;
    }   
     private int getY() {
        return y;
    }
      public MainActivity() {
        mDataset.removeSeries(dataSet);
        mDataset.addSeries(dataSet);


        renderer.setColor(Color.GREEN);
        renderer.setLineWidth(2);
        double xmax = mRenderer.getXAxisMax();
        mRenderer.setXAxisMin(xmax - 5);
        //renderer.setPointStyle(PointStyle.SQUARE);
        //renderer.setFillPoints(true);
         mRenderer.setShowAxes(false);
        mRenderer.setShowGridX(false); // X grid helps identify values
        mRenderer.setShowLabels(false); // See the values
        mRenderer.setXTitle("Milisecond #");
        mRenderer.setYTitle("HeartBeat");
        mRenderer.removeSeriesRenderer(renderer);
        mRenderer.addSeriesRenderer(renderer);
        }
      private GraphicalView getView(Context context) {
        view = ChartFactory.getLineChartView(context, mDataset, mRenderer);
        return view;

    }
    private void addNewPoint(Point p) {
        dataSet.add(p.x, p.y);      
    }
}

【问题讨论】:

  • 我创建了一个从左向右移动的图形。但是当线数增加时,所有的线都聚集在前面。出于这个原因,我想向右滚动图表视图。
  • 我明白了,所以您已经制作了实时图表,但图表会自动拟合以适合所有数据点,而您想要的是一个固定的 x 轴间隔,仅显示最近的数据点,对吧?
  • 正是我想要的。那么你有什么完美的解决方案吗?
  • 顺便说一句,如果您回复我并希望我得到通知,请在回复中输入@ 和我的名字,例如@mango
  • 我简单地告诉你。我想将图表向右移动,同时图表视图将向左移动,以便看起来屏幕向左移动。 @芒果

标签: android achartengine linechart


【解决方案1】:

如果您的图表不使用时间值,那么它应该是直截了当的。如您所知,achartengine 会自动尝试将所有点拟合到一个图形中,以便始终显示右侧。由于您只想控制左侧显示的内容,因此您可以获得最大 x 值,无论它是什么,然后将最小值设置为小于您要显示的间隔。这里的 mrenderer 是 XYMultipleSeriesRenderer

顺便说一句,achartengine 已经将其库升级到 1.0.0

改用这个线程:

    thread = new Thread() {
        public void run() {
            for (int i = 0; i < 200; i++) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Point p = getDataFromReciver(i);
                addNewPoint(p);

                if (i > 5) {
                    mRenderer.setXAxisMin(i - 5);
                }

                view.repaint();
            }
        }
    };
    thread.start();

【讨论】:

  • 我已经更新了我的问题。当我使用 mRenderer.setXAxisMin(..) 时,图形视图中没有任何内容。你能帮我提供任何源代码吗? @芒果
  • 您看起来可能遇到了问题。以防万一,你应该知道你也可以调整 y 轴:mRenderer.setYAxisMax(max);
  • 非常感谢,这正是我想要的。你能告诉我另一件事,比如如果我想动态地改变这个图的数据输入我必须做什么?当我在心跳监视器中使用它时。所以我必须根据脉冲改变数据。 @芒果
  • 这里不需要@mango,回复我的回答时,就在上面。我很抱歉,但我无法理解。例如,您的意思是要在显示心率和脉搏之间切换吗?或者简单地将这些数据动态输入到数据集,就像在这里完成的那样
  • 我是一个非常新的 android 用户和堆栈溢出。我非常感谢您的合作。我正在开发一个心率监测器,我可以在其中显示心率。但我需要一个脉搏率图表,图表应该根据用户的脉搏移动。在这种情况下,如果用户将手指从相机上移开,则图表将仅显示一条水平直线,如果用户放手指,它将显示正确的图表。提前致谢。
最近更新 更多