Застрял в движущемся графике с помощью achartEngine

Привет, друзья, я использовал графики в своем приложении для Android. В этом я обновляю график каждую секунду. Теперь я хочу переместить этот график справа налево, поскольку он обновляет значение. Кто-нибудь знает, как это сделать? Любая помощь приветствуется.

 dataset = new XYMultipleSeriesDataset();

         renderer = new XYMultipleSeriesRenderer();

         renderer.setChartTitleTextSize(12);
         renderer.setLabelsTextSize(15);
         renderer.setMarginsColor(Color.argb(0x00, 0x01, 0x01, 0x01));
         renderer.setApplyBackgroundColor(true);
         renderer.setBackgroundColor(Color.TRANSPARENT);
         renderer.setZoomEnabled(false, false);
         renderer.setPointSize(5f);
         renderer.setShowGrid(true);
         renderer.setXTitle("Time");
         renderer.setYTitle("Number");

         rendererSeries = new XYSeriesRenderer();

         rendererSeries.setColor(Color.BLUE);
         rendererSeries.setFillBelowLine(false);
         rendererSeries.setFillPoints(true);
         rendererSeries.setPointStyle(PointStyle.CIRCLE);
         renderer.addSeriesRenderer(rendererSeries);

         timeSeries = new TimeSeries("Random");
         mThread = new Thread(){
             public void run(){
                 while(true){
                     try {
                         Thread.sleep(2000L);
                     } 
                     catch (InterruptedException e) {
                         e.printStackTrace();
                     }

                     timeSeries.add(new Date(), random.nextInt(10));
                     mchartView.repaint();
                 }
             }
         };
         mThread.start();

         dataset.addSeries(timeSeries);
         mchartView = ChartFactory.getLineChartView(Pedometer.this, dataset, renderer);
         mchartView.refreshDrawableState();
         mchartView.repaint();

         llChart.addView(mchartView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

person Kushal Shah    schedule 29.05.2012    source источник
comment
Размещение вашего кода для вашей деятельности, включая разделы обновления графика, облегчило бы ответ.   -  person cstrutton    schedule 29.05.2012
comment
@KushalShah: Приятель, присылай мне свои материалы, я также сейчас работаю над графиками.   -  person Harpreet    schedule 30.05.2012


Ответы (4)


Вы можете использовать setRange для установки необходимого диапазона каждый раз, когда вы добавляете новую точку. Например:

double maxX = timeSeries.getMaxX();
double minX = maxX - deltaX; // deltaX is your required x-range
double maxY = timeSeries.getMinY();
double minY = timeSeries.getMaxY();

renderer.setRange(new double[] { minX, maxX, minY, maxY });

Таким образом, ваш правый край всегда будет показывать максимальное время, а остальная часть графика будет двигаться справа налево.

Надеюсь, поможет.

person Dimath    schedule 31.05.2012
comment
Эй, братан, свойство setRange относится к библиотеке achartEngine???? Я не нахожу... - person Kushal Shah; 01.06.2012
comment
Ты прав. Извините за это, я исправил свой первоначальный ответ. - person Dimath; 02.06.2012

Если вы хотите, чтобы ваш график двигался, вам нужно добавлять новые данные, как вы это делаете. Как только график полный (имеет столько точек, сколько вы хотите), вам нужно начать удалять самые старые точки. Это даст вам окно, в котором будет отображаться новейшее количество X баллов.

Если вы используете TimeSeries, я думаю, что вы должны иметь возможность вызывать timeSeries.setMaximumItemCount(maxNumPoints), а временные ряды позаботятся обо всем остальном.

Надеюсь это поможет.

person cstrutton    schedule 29.05.2012
comment
привет, спасибо за ответ, но timeSeries не показал мне такое свойство. - person Kushal Shah; 30.05.2012
comment
У него есть метод удаления? Что такое оператор импорта для временных рядов (какой пакет вы используете)? Я нашел несколько имплементаций в Интернете, и все они имели свойство maxcount и метод удаления. - person cstrutton; 30.05.2012
comment
Я не уверен, но похоже, что вы используете aChartEngine. Временные ряды в этом пакете включают метод remove(index). Если вы знаете индекс самого старого элемента, вы можете удалить его таким образом. Или попробуйте пакет aFreeChart. У него есть метод setMaximumItemCount(maxNumPoints), который сделает все это автоматически. (Я не имею отношения ни к одному из этих проектов) - person cstrutton; 30.05.2012

Простой способ позволить вашему графику автоматически вычислять минимальную и максимальную оси — установить для них минимальное и максимальное значение, а затем перекрасить. Например:

mRenderer.setXAxisMax(-Double.MAX_VALUE);
mRenderer.setXAxisMin(Double.MAX_VALUE);
mRenderer.setYAxisMax(-Double.MAX_VALUE);
mRenderer.setYAxisMin(Double.MAX_VALUE);

mChartView.repaint();

Не знаю, лучший ли это вариант, но мне он подходит!

ссылка: Мой Android AChartEngine уже работает, но как сделать так, чтобы он хорошо выглядел?

person Julien    schedule 19.10.2012

В моем коде я придумал следующую идею:

    private void animatePlot(float t, float[] v) {
            // moving plot
            datasets[i].add(t, v[i]);
            if (mPointsCount > GRAPH_RESOLUTION)
                datasets[i].remove(0);
            view.repaint();
            mPointsCount++;
    }
  • t и v соответствуют значениям графика x,y.
  • т растет.
  • когда я получаю новые данные (t и v), я вызываю эту функцию.
  • GRAPH_RESOLUTION — это количество точек, показанных на графике, от которого график начинает двигаться влево.
person Michał Dobi Dobrzański    schedule 22.10.2015