首先要知道重力感应是依靠手机的加速度传感器(accelerometer)实现的
其实所有的传感器的调用步骤都大同小异,如下
1. 声明传感管理对象SensorMannager
调用getSystemService(SENSOR_SERVICE)方法就可以拿到传感器管理对象。
privateSensorManagermSensorManager= null;
mSensorManager = (SensorManager)this.getSystemService(SENSOR_SERVICE);
2. 实现SensorEventListener接口
实现此接口中的onSensorChanged(SensorEventevent)方法来捕获手机传感器的状态
SensorEventListenerlsn = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { x = event.values[SensorManager.DATA_X]; y = event.values[SensorManager.DATA_Y]; z = event.values[SensorManager.DATA_Z]; } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } };
这里简单讲解下重力传感器的数据,
假设当地的重力加速度值为g,其中g是物理学中的重力加速度,一般是9.81
当手机正面朝上的时候,z的值为q,反面朝上的时候,z的值为-g
当手机右侧面朝上的时候,x的值为g,右侧面朝上的时候,x的值为-g
当手机上侧面朝上的时候,y的值为g,右侧面朝上的时候,y的值为-g
如:
手机屏幕向上(z轴朝天)水平放置的时侯,(x,y,z)的值分别为(0,0,10);
手机屏幕向下(z轴朝地)水平放置的时侯,(x,y,z)的值分别为(0,0,-10);
3. 注册SensorEventListener
使用传感管理对象SensorMannager调用registerListener()方法来注册,调用unregisterListener反注册,第三个参数是检测的灵敏精确度,一般在onReusme中实现,参数三为灵敏度
public void onResume(){ mSensorManager.registerListener(lsn, mSensor, SensorManager.SENSOR_DELAY_GAME); super.onResume(); }
这样之后就可以拿到传感器对象了,如下
private Sensor mSensor = null;
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
这里补充下手机的一些传感器:重力感应需要借助加速度传感器
加速度传感器(accelerometer)
陀螺仪传感器(gyroscope)
环境光照传感器(light)
磁力传感器(magnetic field)
方向传感器(orientation)
压力传感器(pressure)
距离传感器(proximity)
温度传感器(temperature)
4. 重力感应简单速度计算的方式
每次摇晃手机计算出 X轴 Y轴 Z轴的重力分量可以将它们记录下来 然后每次摇晃的重力分量和之前的重力分量可以做一个对比,根据物理学公式(x=vt),利用差值和时间就可以计算出他们的移动速度。
5. 项目原码如下:
6. public class MainActivity extends AppCompatActivity { //1.SensorMannager传感器管理对象,手机中的所有传感器都须要通过SensorMannager来访问,调用getSystemService (SENSOR_SERVICE)方法就可以拿到当前手机的传感器管理对象。 private SensorManager mSensorManager = null; private Sensor mSensor = null; //xyz轴参数 private float x, y, z; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); //SensorMannager传感器管理对象 mSensorManager = (SensorManager)this.getSystemService(SENSOR_SERVICE); //拿到加速重力感应的Sensor对象 mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } //2.实现SensorEventListener接口,实现SensorEventListener接口onSensorChanged(SensorEventevent)方法来捕获手机传感器的状态 SensorEventListener lsn = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { x = event.values[SensorManager.DATA_X]; y = event.values[SensorManager.DATA_Y]; z = event.values[SensorManager.DATA_Z]; } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } }; @Override public boolean onTouchEvent(MotionEvent event){ if(event.getAction() == MotionEvent.ACTION_DOWN){ mSensorManager.registerListener(lsn, mSensor, SensorManager.SENSOR_DELAY_GAME); String str = "x=" + x + "; y=" + y + "; z=" + z; Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG).show(); } return super.onTouchEvent(event); } @Override public void onResume(){ //3.注册SensorEventListener,调用registerListener()方法来注册,第三个参数是检测的灵敏精确度, mSensorManager.registerListener(lsn, mSensor, SensorManager.SENSOR_DELAY_GAME); super.onResume(); } @Override public void onPause(){ mSensorManager.unregisterListener(lsn); super.onPause(); } }