TeeChart以不同的速度绘制来自不同轴的线

时间:2016-01-10 16:45:27

标签: android teechart

我使用TeeChart绘制通过BLE接收的传入数据点。 我创建了一个TeeChart,它有三个costum轴,可以将Y轴分成三个大小相同的部分。另外,我初始化了三个FastLines并将每一行分配给一个自定义轴。

//LINES
line1 = new Line(chart1.getChart());
line1.setColor(Color.black);
line1.getLinePen().setWidth(3);

line2 = new Line(chart1.getChart());
line2.setColor(Color.black);
line2.getLinePen().setWidth(3);

line3 = new Line(chart1.getChart());
line3.setColor(Color.black);
line3.getLinePen().setWidth(3);

//AXES
Axis axis0 = new Axis(false, false, chart1.getChart());
axis0.setVisible(true);
axis0.getLabels().setVisible(false);
axis0.getMinorTicks().setVisible(true);
axis0.getTicksInner().setVisible(false);
axis0.getTicks().setVisible(true);
chart1.getAxes().getCustom().add(axis0);
line1.setCustomVertAxis(axis0);
axis0.getTitle().getFont().setSize(textSizeY);
axis0.getTitle().getFont().setBold(true);
axis0.getTitle().setText("1 mV");
axis0.getTitle().setAngle(90);
axis0.setStartPosition(0);
axis0.setEndPosition(33);
axis0.setRelativePosition(0);
axis0.setAutomatic(false);
axis0.setIncrement(100);
axis0.setMinimum(-350);
axis0.setMaximum(+350);

Axis axis1 = new Axis(false, false, chart1.getChart());
axis1.setVisible(true);
axis1.getLabels().setVisible(false);
axis1.getMinorTicks().setVisible(true);
axis1.getTicksInner().setVisible(false);
axis1.getTicks().setVisible(true);
chart1.getAxes().getCustom().add(axis1);
line2.setCustomVertAxis(axis1);
axis1.getTitle().getFont().setSize(textSizeY);
axis1.getTitle().getFont().setBold(true);
axis1.getTitle().setText("1 mV");
axis1.getTitle().setAngle(90);
axis1.setStartPosition(33);
axis1.setEndPosition(66);
axis1.setRelativePosition(0);
axis1.setAutomatic(false);
axis1.setIncrement(100);
axis1.setMinimum(-350);
axis1.setMaximum(+350);

Axis axis2 = new Axis(false, false, chart1.getChart());
axis2.setVisible(true);
axis2.getLabels().setVisible(false);
axis2.getMinorTicks().setVisible(true);
axis2.getTicksInner().setVisible(false);
axis2.getTicks().setVisible(true);
chart1.getAxes().getCustom().add(axis2);
line3.setCustomVertAxis(axis2);
axis2.getTitle().getFont().setSize(textSizeY);
axis2.getTitle().getFont().setBold(true);
axis2.getTitle().setText("1 mV");
axis2.getTitle().setAngle(90);
axis2.setStartPosition(66);
axis2.setEndPosition(100);
axis2.setRelativePosition(0);
axis2.setAutomatic(false);
axis2.setIncrement(100);
axis2.setMinimum(-350);
axis2.setMaximum(+350);

只要有数据通过BLE传输,数据点就会在TeeChart中绘制如下:

public static void addDataToTeeChart(short i){
    if(numberOfPlottablePoints >= 3*MAX_X_POINTS) {
        numberOfPlottablePoints = 0;
        line1.clear();
        line2.clear();
        line3.clear();
    }
    if (numberOfPlottablePoints < MAX_X_POINTS){
        line1.add(i);
    }
    else if (numberOfPlottablePoints < 2*MAX_X_POINTS){
        line2.add(i);
    }
    else if (numberOfPlottablePoints < 3*MAX_X_POINTS){
        line3.add(i);
    }
    numberOfPlottablePoints++;
}

现在的问题是,在向line1添加数据时,一切正常。但是向line2添加数据会变得更慢,并且绘图会产生某种麻烦。对于line3来说情况更糟。

清除并返回向line1添加点后,绘图再次正常。

我在想,也许有太多的数据进来了。 为了排除这一点,我将所有传入的数据添加到line1(将line2和line3留空)。那又好了!

然后我尝试在第2行中绘制所有数据(将Line1和Line3留空),但根本没有绘制数据!

同时减少MAX_X_POINTS以减少绘制点的数量,对我来说没有。

对我而言,似乎问题是在line1,line2和line3之间切换,因为当我只使用一行(使用了哪个自定义轴)时,绘图是平滑的!

我不知道还有什么可以尝试的。

我希望也许有人甚至可以告诉我究竟是什么问题,或者甚至建议做什么。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

我使用您的代码进行了快速测试(稍作修改),这对我来说似乎很合适:

screenshot

我所做的改变基本上是:

  • 禁用3个自定义轴刻度的手动配置。

  • 将图表设置为2D。

  • 使用示例值填充系列,而不是使用addDataToTeeChart函数。

在此处找到代码:

        //LINES
        Line line1 = new Line(tChart1.getChart());
        line1.setColor(Color.black);
        line1.getLinePen().setWidth(3);

        Line line2 = new Line(tChart1.getChart());
        line2.setColor(Color.black);
        line2.getLinePen().setWidth(3);

        Line line3 = new Line(tChart1.getChart());
        line3.setColor(Color.black);
        line3.getLinePen().setWidth(3);

        //AXES
        Axis axis0 = new Axis(false, false, tChart1.getChart());
        axis0.setVisible(true);
        axis0.getLabels().setVisible(false);
        axis0.getMinorTicks().setVisible(true);
        axis0.getTicksInner().setVisible(false);
        axis0.getTicks().setVisible(true);
        tChart1.getAxes().getCustom().add(axis0);
        line1.setCustomVertAxis(axis0);
        //axis0.getTitle().getFont().setSize(textSizeY);
        axis0.getTitle().getFont().setBold(true);
        axis0.getTitle().setText("1 mV");
        axis0.getTitle().setAngle(90);
        axis0.setStartPosition(0);
        axis0.setEndPosition(33);
        axis0.setRelativePosition(0);
        /*axis0.setAutomatic(false);
        axis0.setIncrement(100);
        axis0.setMinimum(-350);
        axis0.setMaximum(+350);*/

        Axis axis1 = new Axis(false, false, tChart1.getChart());
        axis1.setVisible(true);
        axis1.getLabels().setVisible(false);
        axis1.getMinorTicks().setVisible(true);
        axis1.getTicksInner().setVisible(false);
        axis1.getTicks().setVisible(true);
        tChart1.getAxes().getCustom().add(axis1);
        line2.setCustomVertAxis(axis1);
        //axis1.getTitle().getFont().setSize(textSizeY);
        axis1.getTitle().getFont().setBold(true);
        axis1.getTitle().setText("1 mV");
        axis1.getTitle().setAngle(90);
        axis1.setStartPosition(33);
        axis1.setEndPosition(66);
        axis1.setRelativePosition(0);
        /*axis1.setAutomatic(false);
        axis1.setIncrement(100);
        axis1.setMinimum(-350);
        axis1.setMaximum(+350);*/

        Axis axis2 = new Axis(false, false, tChart1.getChart());
        axis2.setVisible(true);
        axis2.getLabels().setVisible(false);
        axis2.getMinorTicks().setVisible(true);
        axis2.getTicksInner().setVisible(false);
        axis2.getTicks().setVisible(true);
        tChart1.getAxes().getCustom().add(axis2);
        line3.setCustomVertAxis(axis2);
        //axis2.getTitle().getFont().setSize(textSizeY);
        axis2.getTitle().getFont().setBold(true);
        axis2.getTitle().setText("1 mV");
        axis2.getTitle().setAngle(90);
        axis2.setStartPosition(66);
        axis2.setEndPosition(100);
        axis2.setRelativePosition(0);
        /*axis2.setAutomatic(false);
        axis2.setIncrement(100);
        axis2.setMinimum(-350);
        axis2.setMaximum(+350);*/

        tChart1.getAspect().setView3D(false);
        line1.fillSampleValues(100);
        line2.fillSampleValues(100);
        line3.fillSampleValues(100);

根据屏幕分辨率增加字体我也使用:

private void proportionalFonts() {
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    float myDensity = metrics.density;
    tChart1.getAspect().setFontZoom(tChart1.getAspect().getFontZoom()*myDensity*1.5);
}

如果您仍然发现问题,请尝试安排sscce