使用AChartEngine在Android中绘制LinkedList(动态)

时间:2012-11-11 20:08:47

标签: android graph linked-list achartengine waveform

我们正在构建一个应用程序,它应该根据输入文本文件执行多项操作。首先,它解析文本文件中的数据并提取有用信息并构建一个linkedList。链接列表是一组BinaryBlock对象。从那里我们想要动态绘制BinaryBlocks的getwfs()函数。在这一点上,我们已经使图形有点工作,但不是随着时间的推移绘制它在一个大块中的图形并一直滚动到最后。

这里列出了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;
    }
}

我认为这是超级简单或线程问题,这是我没有玩过的东西。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

查看代码,我看到您将所有数据添加到系列中,然后调用repaint

如果您希望逐步添加数据,请移动repaint循环中的for并在其中放置Thread.sleep(),以便让UI线程实际执行操作repaint