我需要添加一个可以刷新我的Android应用程序的摇动功能.
我发现的所有文档都涉及实现SensorListener,但Eclipse告诉我它已被弃用并建议使用SensorEventListener.
谁有一个很好的指导我如何创建这个摇动控制器?
解决方法:
这是一个示例代码.
把它放到你的活动类中:
/* put this into your activity class */
private SensorManager mSensorManager;
private float mAccel; // acceleration apart from gravity
private float mAccelCurrent; // current acceleration including gravity
private float mAccelLast; // last acceleration including gravity
private final SensorEventListener mSensorListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent se) {
float x = se.values[0];
float y = se.values[1];
float z = se.values[2];
mAccelLast = mAccelCurrent;
mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z));
float delta = mAccelCurrent - mAccelLast;
mAccel = mAccel * 0.9f + delta; // perform low-cut filter
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
mSensorManager.unregisterListener(mSensorListener);
super.onPause();
}
并将其添加到您的onCreate方法:
/* do this in onCreate */
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
mAccel = 0.00f;
mAccelCurrent = SensorManager.GRAVITY_EARTH;
mAccelLast = SensorManager.GRAVITY_EARTH;
然后,您可以在应用程序中的任何位置询问“mAccel”当前加速度,独立于轴并清除静态加速度(如重力).
它将是约.如果没有移动,则为0;如果设备被抖动,则设为> 2.
根据评论 – 测试这个:
if (mAccel > 12) {
Toast toast = Toast.makeText(getApplicationContext(), "Device has shaken.", Toast.LENGTH_LONG);
toast.show();
}
笔记:
应该在onPause上停用accelometer并在onResume上激活以节省资源(CPU,电池).
代码假定我们在地球上;-)并初始化加速到地球引力.否则,当应用程序启动时,您将获得强烈的“震动”,并从*落体中“击中”地面.然而,由于低截止滤波器,代码习惯于引力,并且一旦初始化,它也可以在其他行星或*空间中工作.
(你永远不知道你的应用程序将被使用多久……