如何在运行时将基于时间的项添加到系列中时移动图形视口?

时间:2015-02-15 20:21:49

标签: android-graphview

我正在尝试创建一个图表,显示通过蓝牙到达的最后n秒数据。我想在计时器中添加DataPoint并将Date作为X值添加到系列中。我得到的只是一个白色的屏幕。我认为问题在于'graph.getViewport()。setMinX`中使用的值。

如果我想显示最后n秒的数据,我应该为minX和maxX设置什么值?

public class MainActivity extends ActionBarActivity {
    private Handler mHandler;
    private GraphView graph;
    LineGraphSeries<DataPoint> serFl = new LineGraphSeries<DataPoint>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initGraph();

        mHandler = new Handler();
        startRepeatingTask();
    }

    private void initGraph() {
        try {
            graph = (GraphView) findViewById(R.id.graph);
            serFl.setColor(Color.BLUE);

            graph.addSeries(serFl);

            graph.getViewport().setXAxisBoundsManual(true);
            graph.getViewport().setMinX(System.currentTimeMillis() - 10000);
            graph.getViewport().setMaxX(System.currentTimeMillis() + 1000);

            graph.getViewport().setYAxisBoundsManual(true);
            graph.getViewport().setMinY(0);
            graph.getViewport().setMaxY(20);

            final SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");

            graph.getGridLabelRenderer().setLabelFormatter(
                new DefaultLabelFormatter() {
                    @Override
                    public String formatLabel(double value, boolean isValueX) {
                        if (isValueX) {
                            Date d = new Date((long) value);
                            return sdf.format(d);
                        } else {
                            // show currency for y values
                            return super.formatLabel(value, isValueX);
                        }
                    }
               });
        } catch (Exception x) {
             System.err.println(x);
        }
    }

    Runnable mStatusChecker = new Runnable() {
        @Override
        public void run() {
            updateStatus(); 
            mHandler.postDelayed(mStatusChecker, mInterval);
        }
    };

    void startRepeatingTask() {
        mStatusChecker.run();
    }

    protected void updateStatus() {
        DataMessage msg = source.fetch();
        long d = msg.getTimestamp();
        serFl.appendData(new DataPoint(d, msg.getFl()), true,
                settings.getMaxSeriesSize());
    }

    void stopRepeatingTask() {
        mHandler.removeCallbacks(mStatusChecker);
    }
}

1 个答案:

答案 0 :(得分:1)

你没有

graph.onDataChanged(false, false);
设置graph.getViewport().setMaxY(20);

这对我的情况有帮助。