XYPlot无法正确绘制所有点

时间:2014-10-16 06:01:28

标签: java android androidplot

我试图显示550个具有周期性峰值的数据点(平线为61)。问题是,androidplot并没有正确地绘制所有点!从我的日志:

ECG I values 61,61,62,63,62,61,61,61,61,67,71,68,61,53,61,61,61,61,61,61,61,61,62,63,64,64,64,63,62,61,61,61

我已将范围边界设置为plot.setRangeBoundaries(0,100, BoundaryMode.AUTO);,但正如您所见,峰值永远不会降至53数据点。我有时会看到这个较低的点,但它会在几分之一秒之后变得平滑(如截图所示)。

我的直线和点格式化程序是:

LineAndPointFormatter lapf = new LineAndPointFormatter(p.color, null, null, null);
lapf.getLinePaint().setStrokeJoin(Paint.Join.MITER);
lapf.getLinePaint().setStrokeWidth(1);

我已尝试同时使用Paint.Join.ROUNDPaint.Join.BEVEL并获得相同的效果。我还使用调试器检查53是否已插入到系列中。

enter image description here

修改

经过一些调试后,看起来我的脉冲循环线程错了:

while (keepRunning) {
    for (PulseXYSeries j : series) {
        for (int k = 0; k < j.plotStep; k++) {
            int at = (j.position + k) % j.getSize();        
            if (j.pulsing) {
                if (j.pulsePosition == j.pulseValues.size() - 1) {
                    j.pulsing = false;
                    j.pulsePosition = 0;
                } else {
                    try {
                        int pulseVal = j.pulseValues.get(j.pulsePosition);
                        j.setY(pulseVal,at); 
                        j.pulsePosition += 1;
                    } catch(IndexOutOfBoundsException e) {
                        j.pulsePosition = 0;
                    }
                }
            } else {
                j.setY(j.pulseValues.get(0), at); 
                long currTime = SystemClock.elapsedRealtime();
                if (currTime - j.getLastPulse() >= j.getPulseDelay()) {
                    j.pulsing = true;
                    j.setLastPulse(currTime);
                }
            }
            j.remove(((at + j.eraserSize) % j.getSize()));
        }
        j.position = (j.position + 1) % j.getSize(); // fixed it by changing +1 to + j.plotStep
    }
    Thread.sleep(delay);
}

我的自定义系列看起来像:

private class PulseXYSeries implements XYSeries {
    private List<Integer> pulseValues = new ArrayList<Integer>();
    private int pulsePerMinute;
    public int pulsePosition;
    public int position;
    private ArrayList<Integer> values;
    private String title;
    private long lastPulse;
    public boolean pulsing = false;
    public int eraserSize = 20;
    public int plotStep = 3;
}

0 个答案:

没有答案