achartengine一个布局中多条动态折线图实时更新效果

来源:互联网 发布:网络舆情概念 编辑:程序博客网 时间:2024/06/10 02:58
package com.example.chenwifi;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.TimeSeries;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import android.view.ViewGroup.LayoutParams;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Paint.Align;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.LinearLayout;
import android.widget.TextView;

@SuppressLint("HandlerLeak")
public class Jiasudu extends Activity {
private long addx;
private float addy1,addy2,addy3;
Date[] x1= new Date[5];
Float[]  y1 =new  Float[5];
Date[] x2= new Date[5];
Float[]  y2 =new  Float[5];
Date[] x3= new Date[5];
Float[]  y3 =new  Float[5];
TextView jiax,jiay,jiaz;
Handler handler,handler2;
LinearLayout layout ;
GraphicalView chart ;
private Context context;
private XYMultipleSeriesDataset dataset1;
TimeSeries series1,series2,series3;
Timer time = new Timer();
TimerTask task;
private String title[]={"X方向加速度","Y方向加速度","Z方向加速度"};
protected void onCreate(Bundle savedInstanceState){
 super.onCreate(savedInstanceState);
  setContentView(R.layout.jiasudu);
  
  jiax = (TextView)findViewById(R.id.jiax);
  jiay = (TextView)findViewById(R.id.jiay);
  jiaz = (TextView)findViewById(R.id.jiaz);
  handler = new Handler(){
  @Override
public void handleMessage(Message msg) {
jiax.setText(Address.a.toString());
jiay.setText(Address.b.toString());
jiaz.setText(Address.c.toString());
   }  
};
  //接受消息上面处理消息
  ClientThread client= new ClientThread(handler);
  new Thread(client).start();
  //画折线图三条线的这回
  context =getApplicationContext();
  layout = (LinearLayout)findViewById(R.id.jiasuduzhexian);
  chart = ChartFactory.getTimeChartView(context,getdemodataset(), getdemorenderer(), "hh:mm:ss");
  layout.removeAllViews();
  layout.addView(chart,new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
  handler2 = new Handler(){  
  public void handleMessage(Message msg) {
  updatechart();
  }
 };
 task = new TimerTask() {
@Override
public void run() {
Message msg =new Message();
msg.what = 1 ;
handler2.sendMessage(msg);
}
};
time.schedule(task, 0, 2000);
}
    public void onDestroy(){
time.cancel();
super.onDestroy();
 }
    
    private void updatechart(){
     addx = new Date().getTime();
//此处加上a8发送的数据就万事大吉了哈哈
/*try {
if(jiax.getText()!=null){
addy1 =Float.valueOf(jiax.getText().toString());
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
try {
if(jiay.getText()!=null){
addy2 = Float.valueOf(jiay.getText().toString());
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
try {
if(jiaz.getText()!=null){
addy3 = Float.valueOf(jiaz.getText().toString());
}
} catch (NumberFormatException e) {
e.printStackTrace();
}*/
addy1 = (float) (Math.random()*10);
addy2= (float) (Math.random()*5);
addy3 = (float) (Math.random()*8);
dataset1.removeSeries(series1);
dataset1.removeSeries(series2);
dataset1.removeSeries(series3);
int length = series1.getItemCount();
//int length2 = series2.getItemCount();
if(length>5){length=5;}
//if(length2>5){length2=5;}
for(int i=0;i<length;i++){
x1[i]=new Date((long) series1.getX(i));
y1[i]= (float) series1.getY(i);
x2[i]= new Date((long) series2.getX(i));
y2[i]= (float) series2.getY(i);
x3[i]= new Date((long) series3.getX(i));
y3[i]=(float) series3.getY(i);
}
series1.clear();
series2.clear();
series3.clear();
series1.add(addx, addy1);
series2.add(addx, addy2);
series3.add(addx, addy3);
for(int k=0;k<length;k++){
series1.add(x1[k], y1[k]);
series2.add(x2[k], y2[k]);
series3.add(x3[k], y3[k]);
}
dataset1.addSeries(series1);
dataset1.addSeries(series2);
dataset1.addSeries(series3);
chart.invalidate();
    }  
  
private XYMultipleSeriesDataset getdemodataset() {
// TODO Auto-generated method stub
dataset1=new XYMultipleSeriesDataset();//xy轴数据源
 final int nr=5;//显示数据个数
 long  value = new Date().getTime();
series1 = new TimeSeries(title[0]); //显示多条在这定义曲线
 for(int i=0;i<nr;i++){
 series1.add(new Date(value), Math.random()*10);//横坐标date数据类型,纵坐标随即数等待更新
       }
    series2 = new TimeSeries(title[1]);
 for(int i=0;i<nr;i++){
     series2.add(new Date(value), Math.random()*10);//横坐标date数据类型,纵坐标随即数等待更新
   }
 series3 = new TimeSeries(title[2]);
 for(int i=0;i<nr;i++){
     series3.add(new Date(value), Math.random()*10);//横坐标date数据类型,纵坐标随即数等待更新
   }
 dataset1.addSeries(series1);
 dataset1.addSeries(series2);
 dataset1.addSeries(series3);
return dataset1;
}

private XYMultipleSeriesRenderer getdemorenderer() {
// TODO Auto-generated method stub
XYMultipleSeriesRenderer render = new XYMultipleSeriesRenderer();
render.setChartTitle("加速度实时曲线");
render.setChartTitleTextSize(20);//设置整个图表标题文字的大小
render.setAxisTitleTextSize(16);//设置轴标题文字的大小
render.setAxesColor(Color.BLACK);
render.setXTitle("时间");
render.setYTitle("加速度");
render.setLabelsTextSize(16);//设置轴刻度文字的大小
render.setLabelsColor(Color.BLACK);
render.setLegendTextSize(15);//设置图例文字大小  
//render.setShowLegend(false);
XYSeriesRenderer r = new XYSeriesRenderer();//设置颜色和点类型 第一条
r.setColor(Color.BLUE);
r.setPointStyle(PointStyle.CIRCLE);
r.setFillPoints(true);
r.setChartValuesSpacing(3);
render.addSeriesRenderer(r);
r =new XYSeriesRenderer();//第二条
r.setColor(Color.RED);
r.setPointStyle(PointStyle.CIRCLE);
r.setFillPoints(true);
r.setChartValuesSpacing(3);
render.addSeriesRenderer(r);
r =new XYSeriesRenderer();//第三条
r.setColor(Color.YELLOW);
r.setPointStyle(PointStyle.CIRCLE);
r.setFillPoints(true);
r.setChartValuesSpacing(3);
render.addSeriesRenderer(r);
render.setYLabelsAlign(Align.RIGHT);//刻度值相对于刻度的位置
render.setShowGrid(true);//显示网格
render.setInScroll(true);
//render.getSeriesRendererAt(0).setDisplayChartValues(true); //显示折线上点的数值
render.setPanEnabled(false,false);//禁止报表的拖动
render.setPointSize(5f);//设置点的大小(图上显示的点的大小和图例中点的大小都会被设置)
render.setMargins(new int[]{20,30,90,10}); //设置图形四周的留白
render.setMarginsColor(Color.WHITE);
        return render ;
}
}
这个里面实现了一个布局多条动态折线图,并且不断更新。




下载地址 http://download.csdn.net/detail/chenaini119/6972465
2 0