2016-01-10 4 views
0

Я использую TeeChart для рисования входящих точек данных, полученных через BLE. Я создал TeeChart, у которого есть три оси costum, чтобы разделить Y-ось на три части одинакового размера. Кроме того, я инициализировал три FastLines и назначил каждую строку одной пользовательской оси.TeeChart рисует линии с разных осей на разных скоростях

//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, все работает только хорошо. Но добавление данных в строку 2 становится медленнее, и рисунок получает какой-то сумасшедший характер. И это еще хуже для line3.

После очистки и возврата к добавлению точек в строку 1, печать снова прекрасна.

Я думал, что, возможно, слишком много данных поступает. Чтобы это исключить, я добавил все входящие данные в строку1 (оставив строки 2 и строку 3 пустыми). Это сработало снова!

Затем я попытался построить все данные в строке2 (оставив Line1 и Line3 пустыми), но данных не было вообще!

Кроме того, уменьшая MAX_X_POINTS, чтобы уменьшить количество нанесенных точек, я не сделал этого для меня.

Для меня кажется, что проблема заключается в переключении между строк1, line2 и line3, потому что, когда я просто использую одну строку (независимо от того, какая пользовательская ось была использована), рисунок является гладким!

Я понятия не имею, что еще попробовать.

Я надеюсь, что, возможно, кто-то может даже сказать мне, что именно может быть проблемой, или даже имеет предложение, что делать.

Спасибо заранее!

ответ

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.

+0

Благодарим вас за ответ. К сожалению, это не очень помогло мне. У меня нет проблем, когда я добавляю такие ценности, как вы. Но когда я добавляю данные последовательно, у меня все еще есть одна и та же проблема. Я записал экран во время потоковой передачи и загрузил его [здесь] (https://drive.google.com/file/d/0BwIv4uYxg6hwUVZfTjBrelJ5X1k/view); Я не уверен, что вы имели в виду с sscce. Что я сделал неправильно в своем посте? Не достаточно короткий или неполный? Извините, я новичок в этом. – Haze3010

+0

Хотелось бы получить полный и компилируемый проект, который мы можем запустить, чтобы воспроизвести проблему здесь – Yeray

+0

О, я вижу. Я загрузил проект [здесь] (https://drive.google.com/file/d/0BwIv4uYxg6hwVFhtRE5ybFlVcUk/view?usp=sharing). Код, который я опубликовал в моем вопросе, можно найти в StarterFragment.java. – Haze3010