2016-03-24 18 views
2

Iは、以下のコードのような2 LineChartを示すために少しをReal Time Line Chart変形例。MPAndroidChart複数の実時間線チャート - 正しいXINDEXで添加していないエントリ

問題:ViewPortが間違って移動され、正しく動作しません。実際のポイント(Entry)が追加されるよりもずっと速く動いています。つまり、Entryが間違った場所に追加され、ViewPortが制御不能に動き続けます。 Entryが追加されるたびに徐々に右に移動する必要があります。この問題を解決するのを手伝ってください。以下の変更を伴う@Tonyのコメントで解決

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

このライブラリは誤解されています。変更set.addEntry(新しいエントリ(値、set.getEntryCount()、0));新しいエントリ(value、data.getXValCount()、0)); set.addEntry(新しいエントリ問題を修正します。 – Tony

+1

なぜmChart.setVisibleXRangeMaximum(30)ですか? ViewPortを動かすためにaddEntryに追加する必要があります。 * initial *メソッドにそれを削除すると、ViewPortの移動が期待通りに機能しません。 – Tony

答えて

0

//set.addEntry(new Entry(value, set.getEntryCount(), 0)); //incorrect 
set.addEntry(new Entry(value, data.getXValCount(), 0)); //correct 

説明:

LineData

は、複数ILineDataSetから構成されている:

数を返すset.getEntryCount() y値の1つをDataSetとし、eff実質的にはyvals.size()に相当します。

data.getXValCount()ChartDataオブジェクトが表すx値の総数を返します。

我々は最後のxインデックスのエントリを追加したいので、私たちはdata.getXValCount()

NOTE使用する必要があります。MPAndroidCharts 3.0.1 data.getXValCount()

をもはや存在しません。代わりに代わりにdata.getXMax() + 1を使用できます。

関連する問題