Android传感器编程实例开发——三轴数据采集
一、概述
Android支持的传感器种类越来越多,这是一件非常可喜的事情,本节就来介绍一下在Android系统下的传感器编程。Android,让我们再一次看到了你的强大!会让我们更加坚定学习Android开发的信心!
二、要求
了解、熟悉传感器的编程方法。
三、实现
新建工程MySensor,修改/res/layout/main.xml文件,在里面添加一个SurfaceView,完整的main.xml文件如下:
1<?xml version="1.0" encoding="utf-8"?>
2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical">
6
7<SurfaceView
8android:id="@+id/surfaceview"
9 android:layout_width="fill_parent"
10 android:layout_height="180dip"
11/>
12
13
14</LinearLayout>
接着,修改MySensorActivity.java文件,代码中有详细注释,完整的MySensorActivity.java文件如下:
1package com.nan.sensor;
2
3import android.app.Activity;
4import android.graphics.Canvas;
5import android.graphics.Color;
6import android.graphics.Paint;
7import android.graphics.Rect;
8import android.hardware.Sensor;
9import android.hardware.SensorEvent;
10import android.hardware.SensorEventListener;
11import android.hardware.SensorManager;
12import android.os.Bundle;
13import android.view.SurfaceHolder;
14import android.view.SurfaceView;
15
16publicclass MySensorActivity extends Activity
17 {
18privatefloat acceValusX = 0f;
19privatefloat acceValusY = 0f;
20privatefloat acceValusZ = 0f;
21privateint x = 0;
22
23private SurfaceView mSurfaceView = null;
24private SurfaceHolder mSurfaceHolder = null;
25private Paint mPaint = null;
26
27private SensorManager mSensorManager;
28private Sensor mAccelerometer;
29private OnSensorEventListener mOnSensorEventListener = new OnSensorEventListener();
30
31/** Called when the activity is first created. */
32 @Override
33publicvoid onCreate(Bundle savedInstanceState)
34
35 {
36super.onCreate(savedInstanceState);
37 setContentView(R.layout.main);
38
39 mSurfaceView = (SurfaceView)findViewById(R.id.surfaceview);
40 mSurfaceHolder = mSurfaceView.getHolder();
41 mSurfaceHolder.addCallback(new MyHolder());
42
43 mPaint = new Paint();
44//画笔的粗细
45 mPaint.setStrokeWidth(1.0f);
46//从系统服务中获得传感器管服务
47 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
48 mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
49//注册传感器监听
50 mSensorManager.registerListener(mOnSensorEventListener, mAccelerometer, SensorManager.SENSOR_DELAY_GAME);
51 }
52
53
54privateclass OnSensorEventListener implements SensorEventListener
55 {
56
57 @Override
58publicvoid onAccuracyChanged(Sensor sensor, int accuracy)
59 {
60// TODO Auto-generated method stub
61
62 }
63
64 @Override
65publicvoid onSensorChanged(SensorEvent event)
66 {
67// TODO Auto-generated method stub
68
69//获得x轴的值
70 acceValusX = event.values[0];
71//获得y轴的值
72 acceValusY = event.values[1];
73//获得z轴的值
74 acceValusZ = event.values[2];
75
76//锁定整个SurfaceView
77 Canvas mCanvas = mSurfaceHolder.lockCanvas();
78try
79 {
80if(mCanvas!=null)
81 {
82//画笔的颜色(红)
83 mPaint.setColor(Color.RED);
84//画X轴的点
85 mCanvas.drawPoint(x, (int)(30 + acceValusX), mPaint);
86//画笔的颜色(绿)
87 mPaint.setColor(Color.GREEN);
88//画Y轴的点
89 mCanvas.drawPoint(x, (int)(60 + acceValusY), mPaint);
90//画笔的颜色(蓝)
91 mPaint.setColor(Color.BLUE);
92//画Z轴的点
93 mCanvas.drawPoint(x, (int)(90 + acceValusZ), mPaint);
94//横坐标+1
95 x++;
96//如果已经画到了屏幕的最右边
97if(x > getWindowManager().getDefaultDisplay().getWidth())
98 {
99 x = 0;
100//清屏
101 mCanvas.drawColor(Color.BLACK);
102 }
103//绘制完成,提交修改
104 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
105 }
106 }
107catch(Exception e)
108 {
109 e.printStackTrace();
110 }
111finally
112 {
113if(mCanvas!=null)
114 {
115//重新锁一次
116 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));
117 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
118 }
119 }
120
121 }
122
123 }
124
125
126//定义一个类,实现Callback接口
127publicclass MyHolder implements SurfaceHolder.Callback
128 {
129
130publicvoid surfaceChanged(SurfaceHolder holder, int format, int width,
131int height)
132 {
133// TODO Auto-generated method stub
134//add your code
135 }
136
137publicvoid surfaceCreated(SurfaceHolder holder)
138 {
139// TODO Auto-generated method stub
140//add your code
141 }
142
143publicvoid surfaceDestroyed(SurfaceHolder holder)
144 {
145// TODO Auto-generated method stub
146//add your code
147 }
148
149 }
150
151 @Override
152publicvoid onDestroy()
153 {
154super.onDestroy();
155//注销传感器监听
156 mSensorManager.unregisterListener(mOnSensorEventListener, mAccelerometer);
157 }
158
159 }
好了,在真机上运行它,效果如下
晃动手机几下,效果如下:
完成。