Я должен добавить опцию встряски, которая обновит мое приложение Android.
Все, что я нахожу документации, включает реализацию SensorListener
, но Eclipse говорит мне, что удерживается от использования, и предложить SensorEventListener
.
Кто-либо, который имеет хорошее руководство по тому, как я иду о создании этого shake controller
?
Вот пример кода. Поместите это в свой класс активности:
/* 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 и активирован onResume для экономии ресурсов (ЦП, батарея). Код предполагает, что мы находимся на планете Земля ;-) и инициализирует ускорение земного притяжения. В противном случае вы получите сильную "тряску", когда приложение запустится и "упадет" на землю от свободного падения. Однако код привыкает к гравитации из-за фильтра низких частот и будет работать также на других планетах или в свободном космосе после инициализации. (вы никогда не знаете, как долго ваше приложение будет использоваться ...; -)
Вы должны подписаться как SensorEventListener
и получить данные акселерометра
.
После того, как вы Имея его, вы должны следить за внезапным изменением направления (знака) ускорения на определенной оси. Это было бы хорошим показателем для «встряхивания»
устройства.