MPAndroidChart多个实时折线图 - 未在正确的xIndex处添加的条目

时间:2016-03-24 04:40:38

标签: mpandroidchart

我修改了Real Time Line Chart示例以显示两个LineChart,如下面的代码所示。

问题:ViewPort移动不正确无法正常工作。它的移动速度比实际点(Entry)快得多。换句话说,Entry被添加到错误的位置,ViewPort无法控制地向右移动。它应该在每个Entry添加时逐渐向右移动。请帮我解决这个问题。

private int year = 2015;
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss.SSS");
private int[] mColors = {Color.BLUE,Color.YELLOW,Color.CYAN,Color.MAGENTA,Color.GREEN};
private int mCurrentColorIndex = 0;

private synchronized void addEntry(String id, float value) {

    LineData data = mChart.getData();

    if (data != null) {

        ILineDataSet set = data.getDataSetByLabel(id,true);
        //ILineDataSet set1 = data.getDataSetByIndex(0);


        if (set == null) {
            set = createSet(id, mColors[(mCurrentColorIndex++)%mColors.length ]);
            data.addDataSet(set);
        }


        String xValue = sdf.format(new Date());

        // add a new x-value first
        data.addXValue(xValue);
        set.addEntry(new Entry(value, set.getEntryCount(), 0));


        // let the chart know it's data has changed
        mChart.notifyDataSetChanged();

        // limit the number of visible entries
        mChart.setVisibleXRangeMaximum(30);
        // mChart.setVisibleYRange(30, AxisDependency.LEFT);

        // move to the latest entry
        mChart.moveViewToX(data.getXValCount() - 31);

        // this automatically refreshes the chart (calls invalidate())
        // mChart.moveViewTo(data.getXValCount()-7, 55f,
        // AxisDependency.LEFT);
    }
}

private LineDataSet createSet(String label, int color) {

    LineDataSet set = new LineDataSet(null, label);
    set.setAxisDependency(AxisDependency.LEFT);
    set.setColor(color);
    set.setCircleColor(Color.WHITE);
    set.setLineWidth(2f);
    set.setCircleRadius(4f);
    set.setFillAlpha(65);
    set.setFillColor(color);
    set.setHighLightColor(Color.rgb(244, 117, 117));
    set.setValueTextColor(Color.WHITE);
    set.setValueTextSize(9f);
    set.setDrawValues(false);
    return set;
}

private void feedMultiple() {

    new Thread(new Runnable() {

        @Override
        public void run() {
            for(int i = 0; i < 50; i++) {

                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        addEntry("name1", (float)(Math.random() * 40) + 30f);
                    }
                });
                try {
                    Thread.sleep(35);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();

    new Thread(new Runnable() {

        @Override
        public void run() {
            for(int i = 0; i < 100; i++) {

                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        addEntry("name2", (float)(Math.random() * 40) + 30f);
                    }
                });
                try {
                    Thread.sleep(35);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();

}

1 个答案:

答案 0 :(得分:0)

@Tony在评论中做出了以下更改:

    private void WavOutChartTimeInterrupt(object waveReader)
{
    lock (AudioLock) //todo add skipto code, use audio lock to do it.
    {
        try
        {
            var curPos = _waveOut.GetPositionTimeSpan(); //get currentPos
            if (curPos <= AudioCurrentPosition)
            {
                AudioCurrentPosition = curPos;
                return;
            }
            var bufferLength = (curPos - AudioCurrentPosition);
            var samplesSec = _waveOutSampleProvider.WaveFormat.SampleRate;
            var channels = _waveOut.OutputWaveFormat.Channels;
            var length = (int) (bufferLength.TotalSeconds * samplesSec * channels) % (samplesSec * channels);
            length -= length% (blockAlign / channels);  //<- THIS FIXED IT
            var wavOutBuffer = new float[length];
            _waveOutSampleProvider.Read(wavOutBuffer, 0, length);

            AudioCurrentPosition = curPos; //update for vCNC with where we are
        }
        catch (Exception e)
        {
            string WTF = e.StackTrace;

            throw new ArgumentException(@"Wave out buffer crashed" + e.StackTrace.ToString());
        }
    }

<强>解释

//set.addEntry(new Entry(value, set.getEntryCount(), 0)); //incorrect set.addEntry(new Entry(value, data.getXValCount(), 0)); //correct 由多个LineData组成:

ILineDataSet会在一个set.getEntryCount()中返回y值的数量,实际上相当于DataSet

yvals.size()返回data.getXValCount()对象所代表的x值的总数。

由于我们希望在最后一个x-index处添加一个条目,我们应该使用ChartData

注意:

在MPAndroidCharts 3.0.1 data.getXValCount()不再存在。您可以改为使用data.getXValCount()