首届 Google 暑期大学生博客分享大赛——2010 Andriod 篇
之前在网上看到一个HTC的Windows Mobile手机中的一个应用重力感应器的程序“蛋疼的小球”,地址: http://v.youku.com/v_show/id_XMTkxOTc0MDg0.html 由于最近本人正在学习Android系统开发,有点跃跃欲试的感觉,想自己也做一个。于是开始做准备工作,找素材就略过不提了。
下面开始第一步,Android中传感器的使用。
Android中有很多API可以直接调用手机中的传感器,通过这些传感器可以得到手机在真实的环境中的速度,空间位置,指向方向,光线感应,磁场,压力计以及温度等信息,获取这些信息之后,就可以做出来一些很炫很好玩的功能。
1. 首先要得到一个手机上的传感器,代码比较简单。通过这行代码我们得到一个硬件设备的控制器。
SensorManager mManager = (SensorManager) getSystemService(SENSOR_SERVICE);
2. 通过上一步得到的硬件控制器,我们要得到想要的传感器,比如重力传感器。需要注意的是有些手机上可能不支持我们需要的传感器,那么mSensor就为null,所以为了安全起见,应该判断是否为null。
Sensor mSensor = sensorMgr.getDefaultSensor(Sensor. TYPE_ACCELEROMETER);
关于其中的参数,还有很多其他的类型。在官方文档中对于各个类型的说明:
int |
TYPE_ACCELEROMETER |
A constant describing an accelerometer sensor type. |
int |
TYPE_ALL |
A constant describing all sensor types. |
int |
TYPE_GYROSCOPE |
A constant describing a gyroscope sensor type |
int |
TYPE_LIGHT |
A constant describing an light sensor type. |
int |
TYPE_MAGNETIC_FIELD |
A constant describing a magnetic field sensor type. |
int |
TYPE_ORIENTATION |
A constant describing an orientation sensor type. |
int |
TYPE_PRESSURE |
A constant describing a pressure sensor type. |
int |
TYPE_PROXIMITY |
A constant describing an proximity sensor type. |
int |
TYPE_TEMPERATURE |
A constant describing a temperature sensor type. |
以屏幕左下角为原点,屏幕上方为Y轴正方向,屏幕右方为X轴正方向,手机屏幕正上方为Z轴正方向,传感器返回的数据都是float型,并且正方向返回正直,反方向返回负值,范围从-10到10,所以根据这些数据和三角函数等,就可以算出手机的运动状态了。
4. 要想得到传感器的数据,就要使用监听器,当手机状态发生变化的时候,就会得到最新的数据。这就需要使用SensorEventListener了,需要重写public void onSensorChanged(SensorEvent e) 和public void onAccuracyChanged(Sensor s, int accuracy),前者是传感器的数据发生变化时所触发的事件,后者是传感器的灵敏度发生改变时触发的事件。
1 SensorEventListener listener = new SensorEventListener() {
2 public void onSensorChanged(SensorEvent e) {
3 x = e.values[SensorManager.DATA_X];
4 y = e.values[SensorManager.DATA_Y];
5 z = e.values[SensorManager.DATA_Z];
6 // do something with x, y, z
7 }
8
5. 通过上一步的代码可以很容易看出监听器的简单和方便性,下一步我们就要注册监听器,注册方法也只有一行代码。
sensorMgr.registerListener(listener, mSensor, SensorManager.SENSOR_DELAY_GAME);
前两个参数上面已经定义,第三个参数为传感器的灵敏度,官方文档中说灵敏度氛围四种:
SENSOR_DELAY_FASTEST 最灵敏
SENSOR_DELAY_GAME 游戏的时候用这个,灵敏度比较高
SENSOR_DELAY_NORMAL 正常一般
SENSOR_DELAY_UI 最不灵敏的一般只有横和纵
通过以上各个步骤,可以很容易得到传感器的数据,通过处理这些数据就可以进行不同的事件等等,当然这个需要开发者的大量实验和想象。暂时重力传感器就先说到这里。