将蜡烛放在图表上而不重叠

时间:2014-08-22 12:59:16

标签: java android teechart

我正在使用TeeChart库在Android上显示烛台图表。

目前我正在开发一个简单的SWT应用程序来测试库的某些功能。

我正在使用

向我的图表添加约400支蜡烛

series.add(c.getOpen(), c.getHigh(), c.getLow(), c.getClose())

当有很多蜡烛显示出来时,它们开始相互过度。

避免这种情况的最佳方法是什么? 我的想法是使用图表宽度,蜡烛宽度和蜡烛间的一些间距来计算可以不重叠显示的蜡烛数量:

private int getNumberOfCandlesVisible() {
    final Candle candles = (Candle) series;
    final int panelWidth = chart.getWidth();
    final int candleWidth = candles.getCandleWidth();

    return panelWidth / (candleWidth + CANDLE_SPACING);
}

然后我尝试使用缩放或series.getCount > getNumberOfCandlesVisible()setMinMax()显示最后N个值。这是正确的方法吗? 我想滚动图表以显示大多数实际值,但它似乎并不顺畅......也许某处有选项?

1 个答案:

答案 0 :(得分:1)

this one非常相似,不是吗? 那么,我想这里的主要问题是如何平滑过渡 要做到这一点,你可以在Android中使用TimerTask。即:

public class MainActivity extends Activity {

    Timer timer;
    MyTimerTask myTimerTask;
    int cycleCount;

    class MyTimerTask extends TimerTask {

        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    cycleCount++;

                    if (cycleCount <= 60) {
                        double tmpIncr = (tChart1.getSeries(0).getXValues().getLast() - tChart1.getSeries(0).getXValues().getValue(tChart1.getSeries(0).getCount()-2)) / 60;
                        tChart1.getAxes().getBottom().setAutomaticMaximum(false);
                        tChart1.getAxes().getBottom().setMaximum(tChart1.getAxes().getBottom().getMaximum()+tmpIncr);
                        tChart1.refreshControl();
                    } else {
                        startStopTimer(false);
                    }
                }
            });
        }
    }

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

        LinearLayout group = (LinearLayout) findViewById(R.id.chart_layout1);
        createChart(group);
        initializeChart();
    }

    private TChart tChart1;
    private int timerInterval, testIndex;
    private int chartPaintCtr;
    private int pointsRefreshed, pointsPlotted;
    private float myDensity;

    private void createChart(LinearLayout group) {
        tChart1 = new TChart(this);
        group.addView(tChart1);
    }

    private void initializeChart() {
        // apply theme
        ThemesList.applyTheme(tChart1.getChart(), 1);
        // multitouch drag zoom
        tChart1.getZoom().setZoomStyle(ZoomStyle.INCHART_MULTI);

        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        myDensity = metrics.density;
        tChart1.getAspect().setFontZoom(
                tChart1.getAspect().getFontZoom() * myDensity);

        // hide things for better speed
        tChart1.getAspect().setView3D(false);
        tChart1.getLegend().setVisible(false);
        tChart1.getFooter().setVisible(false);
        tChart1.getHeader().setVisible(false);
        tChart1.getWalls().setVisible(false);

        tChart1.getZoom().setAnimated(true);
        tChart1.getZoom().setAnimatedSteps(15);

        FastLine lineSeries1 = new FastLine(tChart1.getChart());
        lineSeries1.fillSampleValues();

        tChart1.getAxes().getTop().getGrid().setVisible(false);
        tChart1.getAxes().getRight().getGrid().setVisible(false);

        int sep = 150;
        tChart1.getAxes().getTop().getLabels().setSeparation(sep);
        tChart1.getAxes().getRight().getLabels().setSeparation(sep);
        tChart1.getAxes().getBottom().getLabels().setSeparation(sep);
        tChart1.getAxes().getLeft().getLabels().setSeparation(sep);

        tChart1.getPanel().setMarginLeft(7);

        final Button button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                tChart1.getZoom().setAnimated(false);
                msgSet = false;

                chartPaintCtr = 0;
                cycleCount = 0;

                Random generator = new Random();
                int tmpRandom = generator.nextInt((int)tChart1.getSeries(0).getYValues().getRange()/10);

                tChart1.setAutoRepaint(false);
                tChart1.getSeries(0).add(50, tChart1.getSeries(0).getYValues().getLast()-(int)tChart1.getSeries(0).getYValues().getRange()/20+tmpRandom);
                tChart1.setAutoRepaint(true);

                startStopTimer(true);
            }
        });
    }

    public void startStopTimer(Boolean run) {

        if (run) {

            if (timer != null) {
                timer.cancel();
            }
            // re-schedule timer here
            // otherwise, IllegalStateException of
            // "TimerTask is scheduled already"
            // will be thrown
            timer = new Timer();
            myTimerTask = new MyTimerTask();

            // delay to first xxms, repeat in xxms
            timer.schedule(myTimerTask, 0, timerInterval);
        } else {
            if (timer != null) {
                timer.cancel();
                timer = null;
            }
        }
    }
}

在上面的示例中,我们有一个FastLine系列,其中包含25个值。然后,当我们按下按钮时,我们在远处位置添加另一个点(50)。