这里我们将通过一个”摇一摇”应用来说明如何使用加速度传感器.但在开发之前,我们先对加速度传感器进行一些简单的介绍。
加速的是描述物体运动速度变化快慢的物理量,以m/s2为单位。在静止时,加速度返回的值为地表静止物体的重力加速度,约为9.8m/s2。加速度传感器输出的信息存放在 SensorEvent的values数组中,此时的values数组会有三个值,分别代表手机在x轴,y轴,z轴方向上的加速度信息。
根据力学原理,我们知道重力的作用永远是向下的,所以当手机竖直时,重力作用在y轴,平放在z轴,横立则在x轴。根据输出的值和手机的空间坐标以及重力的作用原理就可以判断手机放置的状态,比如,当x轴的值接近重力加速度或者接近负的重力加速度,说明设备处于横立状态,同时值为正时左边朝下,值为负时右边朝下。
如果要开发一个“摇一摇”应用,根据静止时的加速度约为9.8m/2 以及摇动时的加速度会发生变化,我们可以设置一个加速度的上限,比如说20m/m2,当达到这个上限时就认为手机进行了摇动。了解了其中的原理之后,开发这个应用很简单,只需要修改前面模版中的传感器类型为加速度传感器,即
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
然后修改
@Override
public void onSensorChanged(SensorEvent event){
float x = event.values[0];
float y = event.values[0];
float z = event.values[0];
if(x>20 || y>20 || z>20){
Toast.makeText(this,”欢迎使用摇一摇”,Toast.LENGTH_LONG).show();
}
}
源码:
package com.sdutacm.sensor;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements SensorEventListener{
private SensorManager sensorManager;
private Sensor sensor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSensorManager();
}
@Override
public void onSensorChanged(SensorEvent event) {
//Sensor 发生变化时,在次通过event.values获取数据
float x = event.values[0];
float y = event.values[0];
float z = event.values[0];
if(x>20 || y>20 || z>20){
Toast.makeText(this,"欢迎使用摇一摇",Toast.LENGTH_SHORT).show();
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void getSensorManager() {
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
/**
* 传入的参数决定传感器的类型
* Senor.TYPE_ACCELEROMETER: 加速度传感器
* Senor.TYPE_LIGHT:光照传感器
* Senor.TYPE_GRAVITY:重力传感器
* SenorManager.getOrientation(); //方向传感器
*/
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
@Override
protected void onResume() {
super.onResume();
if(sensorManager != null){
//一般在Resume方法中注册
/**
* 第三个参数决定传感器信息更新速度
* SensorManager.SENSOR_DELAY_NORMAL:一般
* SENSOR_DELAY_FASTEST:最快
* SENSOR_DELAY_GAME:比较快,适合游戏
* SENSOR_DELAY_UI:慢
*/
sensorManager.registerListener(this,sensor,SensorManager.SENSOR_DELAY_NORMAL);
}
}
@Override
protected void onPause() {
super.onPause();
if(sensorManager != null){
//解除注册
sensorManager.unregisterListener(this,sensor);
}
}
}