Android摇一摇
整体思路:对加速感应进行注册监听,满足条件时,开始震动。要注意在不使用时取消监听
- <span style="font-size: 18px;">private SensorManager sensorMgr ;
- private Sensor sensor;
- private static final String TAG = "ShakeTestActivity";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //初始化
- sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
- //取得加速器类型的传感器
- sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
- //传感器的种类很多,可以使用getSensorList方法获得所有可用的感应器,该方法返回的是一个List<Sensor>
- }</span>
private SensorManager sensorMgr ;
private Sensor sensor;
private static final String TAG = "ShakeTestActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//初始化
sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
//取得加速器类型的传感器
sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//传感器的种类很多,可以使用getSensorList方法获得所有可用的感应器,该方法返回的是一个List<Sensor>
}
注册监听器
- <span style="font-size: 18px;">@Override
- protected void onResume() {
- // TODO Auto-generated method stub
- super.onResume();
- if(sensorMgr!=null)
- {
- //注册监听器
- sensorMgr.registerListener(sensorListener, sensor, SensorManager.SENSOR_DELAY_NORMAL);
- /*
- 第三个参数是检测的灵敏度
- SENSOR_DELAY_FASTEST 最灵敏,快的让你无语
- SENSOR_DELAY_GAME 游戏的时候用这个,不过一般用这个就够了,和上一个很难看出区别
- SENSOR_DELAY_NORMAL 比较慢。
- SENSOR_DELAY_UI 最慢的,几乎就是横和纵的区别
- */
- }
- }</span>
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
if(sensorMgr!=null)
{
//注册监听器
sensorMgr.registerListener(sensorListener, sensor, SensorManager.SENSOR_DELAY_NORMAL);
/*
第三个参数是检测的灵敏度
SENSOR_DELAY_FASTEST 最灵敏,快的让你无语
SENSOR_DELAY_GAME 游戏的时候用这个,不过一般用这个就够了,和上一个很难看出区别
SENSOR_DELAY_NORMAL 比较慢。
SENSOR_DELAY_UI 最慢的,几乎就是横和纵的区别
*/
}
}
取消监听
- <span style="font-size: 18px;"> @Override
- protected void onStop() {
- // TODO Auto-generated method stub
- super.onStop();
- if(sensorMgr!=null)
- {
- // 注意,说明文档中提到,即使activity不可见的时候,感应器依然会继续的工作,
- // 所以一定要在onPause方法中关闭触发器,否则将耗费用户大量电量.
- //取消监听
- sensorMgr.unregisterListener(sensorListener);
- }
- }</span>
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
if(sensorMgr!=null)
{
// 注意,说明文档中提到,即使activity不可见的时候,感应器依然会继续的工作,
// 所以一定要在onPause方法中关闭触发器,否则将耗费用户大量电量.
//取消监听
sensorMgr.unregisterListener(sensorListener);
}
}
定义一个SensorEventListener类型的监听
- <span style="font-size: 18px;"> private SensorEventListener sensorListener = new SensorEventListener() {
- //数值发生变化时调用
- @Override
- public void onSensorChanged(SensorEvent event) {
- // TODO Auto-generated method stub
- //感应器很敏感,细小的改变都将被检测到。所以本函数将不停的被调用,即使activity不可见的时候,感应器依然会继续的工作,,所以要注意注销监听
- // (测试时发现,将手机置于水平桌面稳定后 XY均为0 Z的值为9.8 约等于重力加速度
- float [] values = event.values;
- //values[0]或者values[SensorManager.DATA_X]
- float x = values[0]; //X表示左右移动的加速度
- float y = values[1]; //Y表示前后移动的加速度
- float z = values[2]; //Z表示垂直方向的加速度
- Log.i(TAG, "x轴方向的重力加速度" + x + ";y轴方向的重力加速度" + y + ";z轴方向的重力加速度" + z);
- int medumValue = 19</span><pre class="java" name="code"><span style="font-size: 18px;">
- if (Math.abs(x) > medumValue || Math.abs(y) > medumValue || Math.abs(z) > medumValue) {
- //满足条件时,就可进行其他操作如震动
- // vibrator.vibrate(200);
- }
- }
- @Override
- //精确度发生变化时调用
- public void onAccuracyChanged(Sensor sensor, int accuracy) {
- // TODO Auto-generated method stub
- }
- };</span></pre>
- <pre></pre>
- <p></p>
- <pre></pre>
- <span style="font-size: 18px;"><br>
- <br>
- </span>
- <p></p>
- <pre></pre