2017-09-14 83 views
0

我嘗試瞭解這一點,但它不加起來。數據不會像它應該顯示的那樣。將當前時間以毫秒爲單位傳遞給MPChart打破它

首先我生成虛擬數據。這是異步完成的,因爲我需要在System.currentTimeMillis之間調用它們之間的時間間隔。 (這裏看一邊蹩腳的代碼,這是不會在釋放剛調試數據,在主線程上使用的Thread.sleep是一個壞主意,考慮到ANR的)

public class AsyncGeneration extends AsyncTask<String, String, String>{ 
    public AsyncGeneration() { 
     super(); 
    } 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 
    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
    } 
    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
    } 
    @Override 
    protected void onCancelled(String s) { 
     super.onCancelled(s); 
    } 
    @Override 
    protected void onCancelled() { 
     super.onCancelled(); 
    } 
    @Override 
    protected String doInBackground(String... strings) { 
     while(root == null) { 
      try { 
       Thread.sleep(200); 
      }catch(InterruptedException e){} 
     } 
     List<Entry> rdata = new ArrayList<>(); 
     for(int i = 1; i < 30; i++){ 
      try{ 
       Thread.sleep(200); 
      }catch(Exception e){ 
       //IGNORE 
      } 

      float time = System.currentTimeMillis(); 
      Log.e("GChart", "Timex: " + time); 
      Session s = new Session(r.nextInt(5000), time);//Replace time with the index in the for-loop and it works for some reason 
      rdata.add(new Entry(s.getXValue(), s.getYValue())); 
      Log.e("GChart", "Timey: " + s.getXValue()); 
     } 

     final List<Entry> entries = rdata; 
     OverviewFragment.this.getActivity().runOnUiThread(() ->{ 

      LineDataSet data = new LineDataSet(entries, "Distance"); 
      data.setCircleColor(Color.parseColor("#FF0000")); 
      LineData lineData = new LineData(data); 
      tab1chart.setData(lineData); 

      tab1chart.invalidate(); // refresh 

      tab1chart.getXAxis().setValueFormatter(new DateFormatter()); 
      tab1chart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM); 
      tab1chart.getXAxis().setTextSize(10f); 
      tab1chart.getXAxis().setTextColor(Color.RED); 
      tab1chart.getXAxis().setDrawAxisLine(true); 
      tab1chart.getXAxis().setDrawGridLines(true); 
      tab1chart.getAxisLeft().setValueFormatter(new DistanceValueFormatter()); 
      tab1chart.getAxisLeft().setDrawGridLines(true); 
      Log.v("Chart", "Chart data loaded and invalidated");//This prints 

     }); 
     return null; 
    } 
} 

到目前爲止,一切都看起來不錯。數據被放入圖表,沒有例外,沒有崩潰。

當圖表呈現時,單個數據點出現在圖表的最左側。我生成了30個數據點,其中一個出現。

問題#1:只有一個數據點出現。

問題#2稍微有些困難。底部的整個X軸消失。 X軸消失,當縮放時,Y軸及其文字也消失。這是相當難以解釋,所以這裏是截圖:

Single data point

Single data point, X and Y axis missing

值得一提的是,如果我在傳遞i for循環的時候,它顯示了正如預期的那樣:所有的軸都在位,縮放不會破壞任何東西。

(除非他們有另外小數浮點值可以採取相同的值多頭。)

,此外,我格式化數據:

public class DateFormatter implements IAxisValueFormatter { 
    SimpleDateFormat formatter; 

    public DateFormatter(){ 
     formatter = new SimpleDateFormat("dd/MM/yy, HH:mm"); 
    } 

    @Override 
    public String getFormattedValue(float value, AxisBase axis) { 
     //This method is never called. Nothing is returned 
     if(axis instanceof XAxis) { 
      String formatted = formatter.format(new Date((long) value)); 
      Log.d("Formatter", "Formatted \"" + value + "\" to \"" + formatted + "\"."); 
      return formatted; 
     } 
     return "Not supported"; 
    } 
} 

刪除格式並不能改變什麼,軸線仍然消失。縮放仍會打破Y軸。

所以我的問題是:我該如何解決這個問題?我不明白爲什麼當我以毫秒爲單位傳遞當前時間時圖表不起作用(並且我使用調試輸出檢查了這些值,而浮動可以處理它)。我得到了一些調試輸出早些時候,最終停止來的所有顯示傳遞給格式化程序的值是值< 2000.我不能再現這個更多,雖然

圖表本身似乎並沒有被打破,但從觸摸事件,它看起來像每個單一點被推入同一個X座標,但只有一個點呈現。當我觸摸圖表時,橙色線將顯示指示數據點的位置。它彈出不可見的點。

當我將循環索引作爲X值傳遞時,它的工作方式與預期的一樣,格式化程序可以正常工作(放在1970年顯示日期的事實上,但它被計爲1毫秒進入曆元,所以期待)

我看着this以及格式化日期。當我嘗試傳遞自紀元以來的毫秒時,圖表停止工作。

我正在使用MPChart v 3.0.2,針對Android 26編譯,使用Java 8並運行Android Studio 3。0 beta 2

至於佈局,它只是一個LinearLayout和一個LineChart。


這應該可以工作,但是當我以某種原因以毫秒爲單位傳遞它時會中斷。傳遞任何其他數據(只要數字不是那麼大)可以正常工作。

這兩個圖像不是圖表應該看起來的樣子。 X軸應該是可見的,但由於某種原因,它並沒有伴隨大量的數據。

回答

2

這是Android MPCharthave a read this thread)的已知問題。 MPChart支持的時間系列圖 - 您可以將時間(在millis中)設置爲小時圖的X值。

但是太多的連續數據(點)不會在折線圖中正確繪圖。因爲Entry對象由於某些性能限制將只接受浮點值。

所以,保持第一值作爲參考,並減去每上升一些常量從參考價值未來價值 &鴻溝(比如1000)。所以,你X value組會像10,20,30 ... &等。

執行Axis Value formatter中的反向邏輯以正確呈現X Axis標籤(請參閱代碼段)。

lineChart.getXAxis().setValueFormatter(new IAxisValueFormatter() { 
      @Override 
      public String getFormattedValue(float value, AxisBase axis) { 

       SimpleDateFormat format2 = new SimpleDateFormat("HH:mm:ss"); 
       return format2.format(new Date(firstTimeStamp + ((long) value) * 1000L)); 

      } 

     }); 
+0

我已經除以十億將其降低到數千,現在有小數的問題。我無法獲得足夠的小數來支持它。分割時會丟失太多細節。 1000無效,100萬無效,10億無效。最後一個可以有,如果它足夠準確 – Zoe

+0

@LunarWatcher在分割之前,你必須從參考/偏移值減去每個值。你試過嗎? –

+0

現在就這樣做。我不能劃分,第一個數字是0,除以0則拋出ArithmeticException。我不劃分,但追蹤初始值並從該作品中減去。現在,圖表不會出現X軸消失或值停留在一個點上的情況。謝謝! (不能獎勵另一個22小時的獎勵,但這是有效的,一旦Stack Overflow允許我會獎勵它)​​ – Zoe

相關問題