Android アプリケーションを更新するシェイク機能を追加する必要があります。
私が見つけたドキュメントは の実装に関するものばかりですSensorListener
が、Eclipse ではそれが非推奨であり を提案していると表示されますSensorEventListener
。
これを作成する方法についてのよいガイドを持っている人はいますかshake controller
?
ベストアンサー1
以下にサンプルコードを示します。これをアクティビティ クラスに追加します。
/* 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();
}
ノート:
リソース (CPU、バッテリー) を節約するために、加速度計は一時停止時に非アクティブにし、再開時にアクティブにする必要があります。このコードは、地球上にいると想定し、加速度を地球の重力に合わせて初期化します。そうしないと、アプリケーションが起動して自由落下で地面に「ぶつかる」ときに、強い「揺れ」が発生します。ただし、コードはローカット フィルターによって重力に慣れ、初期化されると他の惑星や自由空間でも機能します。(アプリケーションがどのくらい長く使用されるかはわかりません...;-)