重力球——重力感应器应用

     首届 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.

由于本次只需要重力感应器,即“加速度”TYPE_ACCELEROMETER,其他的感应器本次不使用,以后会陆续试用。
     3. 通过重力感应器的数据,我们可以知道手机的偏转度,然后才能控制小球的移动。这里对手机上X、Y、Z三维坐标系说明一下,借助网上某网友的图片说明一下。
重力球——重力感应器应用

以屏幕左下角为原点,屏幕上方为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  最不灵敏的一般只有横和纵

      通过以上各个步骤,可以很容易得到传感器的数据,通过处理这些数据就可以进行不同的事件等等,当然这个需要开发者的大量实验和想象。暂时重力传感器就先说到这里。

你可能感兴趣的:(应用)