Привет друзья, я использовал графики в приложении для 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));
Вы можете использовать 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 });
Таким образом, ваш правый край всегда показывает максимальное время, а остальная часть графика будет перемещаться справа налево.
Надеюсь, поможет.
В моем коде я придумал следующую идею:
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++;
}
Легкий способ позволить вашему графику автоматически вычислять свои оси min и max, чтобы установить их на минимальное и максимальное значение, а затем перерисовать. Например:
mRenderer.setXAxisMax(-Double.MAX_VALUE);
mRenderer.setXAxisMin(Double.MAX_VALUE);
mRenderer.setYAxisMax(-Double.MAX_VALUE);
mRenderer.setYAxisMin(Double.MAX_VALUE);
mChartView.repaint();
Я не знаю, лучший ли это вариант, но он работает для меня!
ссылка: Мой Android AChartEngine уже работает, но как заставить его выглядеть хорошо?
Если вы хотите, чтобы ваш график перемещался, вам нужно добавить новые данные, как вы делаете. Как только график будет заполнен (у вас будет столько же очков), вам нужно будет удалить самые старые очки. Это даст вам окно, в котором будет отображаться новейшее количество точек X.
Если вы используете TimeSeries, я думаю, что вы используете, вы должны иметь возможность называть timeSeries.setMaximumItemCount(maxNumPoints)
а временные ряды позаботятся об остальном.
Надеюсь это поможет.