android 绘制实时曲线,Android 三轴绘制实时加速度曲线

public class GsensorActivity extends Activity implementsSensorEventListener {private static final String TAG = "GsensorActivity";privateSensorManager mSensorManager;privateSensor mSensor;privateTextView textviewX;privateTextView textviewY;privateTextView textviewZ;privateTextView textviewF;private floatmX, mY, mZ;private long lasttimestamp = 0;

Calendar mCalendar;privateGraphicalView chart;/**曲线数量*/

private static final int SERIES_NR = 1;privateTimeSeries series1;privateXYMultipleSeriesDataset dataset1;private float addY = -1;private longaddX;/**时间数据*/Date[] xcache= new Date[20];/**数据*/

float[] ycache = new float[20];

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_gsensor);

textviewX=(TextView) findViewById(R.id.textView1);

textviewY=(TextView) findViewById(R.id.textView3);

textviewZ=(TextView) findViewById(R.id.textView4);

textviewF=(TextView) findViewById(R.id.textView2);

lasttimestamp=System.currentTimeMillis();

LinearLayout layout=(LinearLayout) findViewById(R.id.linearlayout);//生成图表

chart = ChartFactory.getTimeChartView(this, getDateDemoDataset(),

getDemoRenderer(),"hh:mm:ss");

layout.addView(chart,new LayoutParams(LayoutParams.WRAP_CONTENT, 380));

mSensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);

mSensor= mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//TYPE_GRAVITY

if (null ==mSensorManager) {

Log.d(TAG,"deveice not support SensorManager");

}//参数三,检测的精准度

mSensorManager.registerListener(this, mSensor,

SensorManager.SENSOR_DELAY_NORMAL);//SENSOR_DELAY_GAME

}private void updateChart(floata) {//设定长度为20

int length =series1.getItemCount();if (length >= 20)

length= 20;

addY=a;

addX= newDate().getTime();//将前面的点放入缓存

for (int i = 0; i < length; i++) {

xcache[i]= new Date((long) series1.getX(i));

ycache[i]= (float) series1.getY(i);

}

series1.clear();

series1.add(newDate(addX), addY);for (int k = 0; k < length; k++) {

series1.add(xcache[k], ycache[k]);

}//在数据集中添加新的点集

dataset1.removeSeries(series1);

dataset1.addSeries(series1);//曲线更新

chart.invalidate();

}/*** 设定如表样式

*

*@return

*/

privateXYMultipleSeriesRenderer getDemoRenderer() {

XYMultipleSeriesRenderer renderer= newXYMultipleSeriesRenderer();

renderer.setChartTitle("实时曲线");//标题

renderer.setChartTitleTextSize(20);

renderer.setXTitle("时间"); //x轴说明

renderer.setAxisTitleTextSize(16);

renderer.setAxesColor(Color.BLACK);

renderer.setLabelsTextSize(15); //数轴刻度字体大小

renderer.setLabelsColor(Color.BLACK);

renderer.setLegendTextSize(15); //曲线说明

renderer.setXLabelsColor(Color.BLACK);

renderer.setYLabelsColor(0, Color.BLACK);

renderer.setShowLegend(false);

renderer.setMargins(new int[] { 20, 30, 100, 0});

XYSeriesRenderer r= newXYSeriesRenderer();

r.setColor(Color.BLUE);

r.setChartValuesTextSize(15);

r.setChartValuesSpacing(3);

r.setPointStyle(PointStyle.CIRCLE);

r.setFillBelowLine(true);

r.setFillBelowLineColor(Color.WHITE);

r.setFillPoints(true);

renderer.addSeriesRenderer(r);

renderer.setMarginsColor(Color.WHITE);

renderer.setPanEnabled(false, false);

renderer.setShowGrid(true);

renderer.setYAxisMax(50);

renderer.setYAxisMin(-30);

renderer.setInScroll(true); //调整大小

returnrenderer;

}/*** 数据对象

*

*@return

*/

privateXYMultipleSeriesDataset getDateDemoDataset() {

dataset1= newXYMultipleSeriesDataset();final int nr = 10;long value = newDate().getTime();

Random r= newRandom();for (int i = 0; i < SERIES_NR; i++) {

series1= new TimeSeries("Demo series " + (i + 1));for (int k = 0; k < nr; k++) {

series1.add(new Date(value + k * 1000), 0);

}

dataset1.addSeries(series1);

}

Log.i(TAG, dataset1.toString());returndataset1;

}

@Overridepublic void onAccuracyChanged(Sensor sensor, intaccuracy) {

}

@Overridepublic voidonSensorChanged(SensorEvent event) {if (event.sensor == null) {return;

}if (event.sensor.getType() ==Sensor.TYPE_ACCELEROMETER) {float x = event.values[0];float y = event.values[1];float z = event.values[2];

mCalendar=Calendar.getInstance();long stamp = mCalendar.getTimeInMillis();//1393844912

textviewX.setText(String.valueOf(x));

textviewY.setText(String.valueOf(y));

textviewZ.setText(String.valueOf(z));int second = mCalendar.get(Calendar.SECOND);//53

float px = Math.abs(mX -x);float py = Math.abs(mY -y);float pz = Math.abs(mZ -z);

Log.d(TAG,"pX:" + px + " pY:" + py + " pZ:" + pz + " stamp:"

+ stamp + " second:" +second);float maxvalue =getMaxValue(px, py, pz);if (maxvalue > 2 && (stamp - lasttimestamp) > 200) {

lasttimestamp=stamp;

updateChart(x+y+z);

textviewF.setText("检测手机在移动..");

}mX=x;

mY=y;

mZ=z;

}

}/*** 获取一个最大值

*

*@parampx

*@parampy

*@parampz

*@return

*/

public float getMaxValue(float px, float py, floatpz) {float max = 0;if (px > py && px >pz) {

max=px;

}else if (py > px && py >pz) {

max=py;

}else if (pz > px && pz >py) {

max=pz;

}returnmax;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值