【问题标题】:How to do auto Pan (scrolling) with AChartEngine dynamic line graph along with X-axis?如何使用 AChartEngine 动态线图和 X 轴进行自动平移(滚动)?
【发布时间】:2013-05-15 14:13:01
【问题描述】:

我使用 AChartEngine Api 创建了动态折线图,它显示了 G-Force 值的变化。一切正常,但当图形在 X 轴上向前移动时,我必须在 X 轴上手动滚动才能进一步查看,如果您没有正确理解我,请查看下面的图片。

如何让它在 x 轴上自动滚动以避免手动滚动?

以下是我的代码

public class GraphActivity extends Activity implements SensorEventListener{

    private LinearLayout lyGforce;


    //=== G-force =======
    private SensorManager mSensorManager;
    private Sensor mAccelerometer;
    private float gOffset;
    private boolean calibrate;
    private static TimeSeries timeSeriesGforce;
    private static XYMultipleSeriesDataset datasetGforce;
    private static XYMultipleSeriesRenderer rendererGforce;
    private static XYSeriesRenderer rendererSeriesGforce;
    private static GraphicalView viewGforce;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mainactivity);

        lyGforce = (LinearLayout) findViewById(R.id.lygforce);

        //=========== G-force =======
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

        datasetGforce = new XYMultipleSeriesDataset();
        rendererGforce = new XYMultipleSeriesRenderer();
        rendererGforce.setApplyBackgroundColor(true);
        rendererGforce.setBackgroundColor(Color.argb(100, 50, 50, 50));
        rendererGforce.setAxisTitleTextSize(16);
        rendererGforce.setChartTitleTextSize(20);
        rendererGforce.setLabelsTextSize(15);
        rendererGforce.setLegendTextSize(15);
        rendererGforce.setMargins(new int[] { 20, 30, 15, 0 });
        rendererGforce.setZoomButtonsVisible(true);
        rendererGforce.setPointSize(10);
        rendererGforce.setShowGrid(true);
        rendererGforce.setGridColor(Color.WHITE);

        rendererSeriesGforce = new XYSeriesRenderer();
        rendererSeriesGforce.setColor(Color.GREEN);
        rendererSeriesGforce.setLineWidth(2);

        rendererGforce.addSeriesRenderer(rendererSeriesGforce);

        timeSeriesGforce = new TimeSeries("G-Force");

        datasetGforce.addSeries(timeSeriesGforce);

        viewGforce = ChartFactory.getTimeChartView(this, datasetGforce, rendererGforce, "");
        viewGforce.refreshDrawableState();
        viewGforce.repaint();

        lyGforce.addView(viewGforce);


    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();

        // ============= G-force ==================//
        calibrate = true;
        mSensorManager.registerListener(this, mAccelerometer,
                SensorManager.SENSOR_DELAY_UI);
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();

        //========== G-force=============//
        mSensorManager.unregisterListener(this);
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub

    }

    //========== G-force=============//
    @Override
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub

        switch (event.sensor.getType()) {

            case Sensor.TYPE_ACCELEROMETER:

                float x = event.values[0];
                float y = event.values[1]; // Use to calculate G-Force value
                float z = event.values[2];

                if(calibrate)
                    gOffset = y - SensorManager.GRAVITY_EARTH;

                double gForce = ((y - gOffset) / SensorManager.GRAVITY_EARTH);

                timeSeriesGforce.add(new Date(), gForce);

                  rendererGforce.setXAxisMax(rendererGforce.getXAxisMax() + 30);
           rendererGforce.setXAxisMin(rendererGforce.getXAxisMin() + 30);

                viewGforce.repaint();

                Log.e("NIRAV","G-Force: "+String.valueOf(gForce));

                calibrate = false;

            break;

            default:
                break;
        }
    }

}

【问题讨论】:

    标签: android achartengine android-scroll android-graphview


    【解决方案1】:

    您可以通过更改 X 轴上的可见区域来做到这一点:

    renderer.setXAxisMin(min);
    renderer.setXAxisMax(max);
    

    【讨论】:

    • @Dan..thanx 回复.. 请检查我的问题我添加我的代码请让我知道在哪里以及如何使用 setXAxisMin() 和 setXAxisMax() 方法?
    • 将代码放在 repaint() 调用之前。最小值和最大值应该是您希望可见范围介于两者之间的 X 轴值。
    • @Dan.. 它工作 thnx.. +1... 但滚动速度较慢,然后我的图表在 x 轴上前进.. 我编辑了我的代码并将这两种方法放在 repaint() 之前你告诉..请多帮忙..“max”和“min”应该是什么值?
    • Max 应该是最近添加的 X 值,min 是您的选择。例如索引 lastIndex - 50 处的值。
    • 嘿@Dan,如何避免第一次手动滚动的情况,完成后图形开始自动滚动......任何想法/建议?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2021-07-11
    • 2013-07-23
    • 2013-12-22
    相关资源
    最近更新 更多