2012-11-11 25 views
2

我們正在構建一個應用程序,該應用程序應根據輸入文本文件執行幾件事。首先它解析文本文件中的數據並提取有用的信息並構建一個linkedList。鏈接列表是一組BinaryBlock對象。從那裏我們要動態地繪製BinaryBlocks的getwfs()函數。在這一點上,我們已經有了一些有用的圖表,但是隨着時間的推移而不是隨着時間的推移繪製出來,而是一個大塊的圖表,並一直滾動到最後。使用AChartEngine(動態)在Android中繪製LinkedList

BinaryBlock是列在這裏:

這是全面測試和功能,實際上應該只在程序的大背景下重要:

// BinaryBlock.java 

public class BinaryBlockLite { 


private int pwda[], wfs[]; 

String lineData; 

public BinaryBlockLite(String data){ // class constructor 
    lineData = data; 
    pwda = new int[5]; 
    wfs = new int[4]; 

    setWfs(); 

}//end constructor 

    public String WfsToString(){ 
    if (wfs.length == 0) 
     return ""; 

    String data = "Channel 2: "; 
    for(int i = 0; i < wfs.length; ++i){ 
     data = data + "wfs[" + i + "]=" + wfs[i] + " "; 
    } 
    return data + "\n"; 
} 


    //=========================================================== 
// Setters 
//============================================================= 


//read the 5 individual bytes of the Pwda from LineData and into the pwda[] array 
private void setPwda(){ 
    int location = 13; 
    for(int i = 0; i < 5; ++i){ 

     String temp = "" + lineData.charAt(++location) + lineData.charAt(++location); 

     pwda[i] = Integer.parseInt(temp, 16); 
    } 
} 

//logically manipulate the 5 bytes of the PWDA into 4 10-bit WFSs 
private void setWfs(){ 
    setPwda(); 
    int j = 0; 

    for (int i = 0; i < 4; ++i){ 
     wfs[i] = ((pwda[j] << 2) | ((pwda[j + 1] >> 6) & 0x03)) & 0x03ff; 
     wfs[++i] = ((pwda[j + 1] << 4) | ((pwda[j + 2] >>> 4) & 0x0f)) & 0x03ff; 
     wfs[++i] = ((pwda[j + 2] << 6) | ((pwda[j + 3] >>> 2) & 0x3f)) & 0x03ff; 
     wfs[++i] = ((pwda[j + 3] << 8) | ((pwda[j + 4] >>> 0) & 0xff)) & 0x03ff; 
    } 
} 




    //=========================================================== 
// Getters 
//============================================================= 


public int[] getPwda(){ 
    return pwda; 
} 
public int[] getWfs(){ 
    return wfs; 
} 




}//end BinaryBlock Class 

主線束這裏列出: 問題是根本它不是每次重繪並在屏幕上繪製圖形,而是一次繪製所有點。

//MainActivity.java 

import android.os.Bundle; 
import android.app.ActionBar.LayoutParams; 
import android.app.Activity; 
import android.content.Context; 
import android.content.res.AssetManager; 
import android.graphics.Color; 
import android.view.Menu; 

import android.view.View; 
import android.widget.Button; 
import android.widget.LinearLayout; 

import com.smith.fsu.wave.BinaryBlockLite; 

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.LinkedList; 
import java.util.ListIterator; 

import org.achartengine.ChartFactory; 
import org.achartengine.GraphicalView; 
import org.achartengine.model.XYMultipleSeriesDataset; 
import org.achartengine.model.XYSeries; 
import org.achartengine.renderer.XYMultipleSeriesRenderer; 
import org.achartengine.renderer.XYSeriesRenderer; 


public class MainActivity extends Activity { 

    public static LinkedList<BinaryBlockLite> list; 
    Button btnMain; 
    Boolean fileLoaded = false; 
    int xTick = 0, 
     lastMinX = 0; 
    Context context = this; 

    // 

    //////////////////////////////////////////////////////////////// 
    //import test 


    private XYMultipleSeriesDataset WFDataset = new XYMultipleSeriesDataset(); 
    private XYMultipleSeriesRenderer WaveFormRenderer = new XYMultipleSeriesRenderer(); 
    private XYSeries WFCurrentSeries; 
    private GraphicalView WFChartView; 

    ////////////////////////////////////////////////////////////////////////// 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     list = new LinkedList<BinaryBlockLite>(); 
     btnMain=(Button)findViewById(R.id.btnMain); 
     WaveFormRenderer.setAxisTitleTextSize(16); 
     WaveFormRenderer.setChartTitleTextSize(20); 
     WaveFormRenderer.setLabelsTextSize(15); 
     WaveFormRenderer.setLegendTextSize(15); 
     WaveFormRenderer.setMargins(new int[] {20, 30, 15, 0}); 
     WaveFormRenderer.setAxesColor(Color.YELLOW); 

     String seriesTitle = "Input Data"; 
     XYSeries series = new XYSeries(seriesTitle); 

     WFDataset.addSeries(series); 
     WFCurrentSeries = series; 

     XYSeriesRenderer renderer = new XYSeriesRenderer(); 
     renderer.setColor(Color.GREEN); 
     WaveFormRenderer.addSeriesRenderer(renderer); 
     WaveFormRenderer.setXAxisMin(0.0); 
     WaveFormRenderer.setXAxisMax(500); 


//  renderer.setFillBelowLine(true) ; 
//  renderer.setFillBelowLineColor(Color.BLUE); 
    } 







    public void chartClick(View view) throws IOException{ 

       String strData = ""; 
       AssetManager amInput = context.getAssets(); 
       BufferedReader reader; 
       InputStream is = null; 
       try { 
        is = amInput.open("Dinamap-Data.txt"); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       reader = new BufferedReader(new InputStreamReader(is)); 

       try { 
        while((strData = reader.readLine()) != null) { 


         addBlock(strData); //call to paint line 

        } 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       }//while loop 
       try { 
        reader.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 




    }//end mainClick() method for btnMain 










    public void writeClick(View view){ 
     //write decimal data for wfs out to file from LinkedList<BinaryBlock> 
     //using WfsToString() method of BinaryBlock class in separate thread 
     (new Thread(new Runnable() { 
      @Override 
      public void run() { 
       FileOutputStream fos = null; 
       try { 
        fos = openFileOutput("wfs.txt", Context.MODE_WORLD_READABLE); 
       } catch (FileNotFoundException e1) { 
        e1.printStackTrace(); 
       } 
       ListIterator<BinaryBlockLite> itr = list.listIterator(); 
       while (itr.hasNext()){ 
        String temp = itr.next().WfsToString(); 
        try { 
         fos.write(temp.getBytes()); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
       try { 
        fos.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

      } 
     })).start(); 
     btnMain.setEnabled(false); 
    } 












    private void addBlock(final String strData) { 
     new Thread(new Runnable() { 
      public void run() { 


       int wfs[]; 

       //read line into binaryBlockLite object and store object in Linked List 
       BinaryBlockLite bb = new BinaryBlockLite(strData); 
       list.add(bb); 

       //get the wfs data from the BinaryBlockLite object 
       wfs = new int[bb.getWfs().length]; 
       wfs = bb.getWfs(); 

       //grab each wfs individually and paint to the chart, and increment xTick 
       for (int k = 0; k < wfs.length; ++k){ 
        /* check if we need to shift the x axis */ 
        if (xTick > WaveFormRenderer.getXAxisMax()) { 
         WaveFormRenderer.setXAxisMax(xTick); 
         WaveFormRenderer.setXAxisMin(++lastMinX); 
        } 

        if (wfs[k] > 1000){ 
         WFCurrentSeries.add(xTick, WFCurrentSeries.getY(xTick - 1)); 
        } 
        else{ 
         WFCurrentSeries.add(xTick, wfs[k]); 
        } 
        ++xTick;  
       } 
       WFChartView.repaint(); 

      } 
     }).start(); 

    } 















    @Override 
    protected void onResume() { 

     super.onResume(); 
     if (WFChartView == null) { 
      LinearLayout layout = (LinearLayout) findViewById(R.id.WFchart); 
      WFChartView = ChartFactory.getLineChartView(this, WFDataset, WaveFormRenderer); 

      layout.addView(WFChartView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
//   boolean enabled = WFDataset.getSeriesCount() > 0; 
//   setSeriesEnabled(enabled); 
      } else { 
       WFChartView.repaint(); 
      } 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
} 

我認爲它要麼超級簡單或線程問題這是一件好事,我沒有足夠的發揮。任何幫助,將不勝感激。

回答

0

查看代碼,我看到您將所有數據添加到該系列,然後致電repaint

如果要逐步添加的數據,然後將for循環內的repaint,把一個Thread.sleep()裏面,給個機會UI線程實際上做repaint

+0

我們試過這個,但它仍然不起作用。我們想,也許如果我們將它們分成兩個不同的線程,但它仍然凍結,直到最後一刻,再次吐出完整的圖。由於某種原因,它不會變成動態的。 – Gann14

相關問題