1. ホーム
  2. android

[解決済み] アンドロイドでシェイクを検出するには?

2022-07-14 14:04:18

質問

アンドロイドで手ぶれを検出するにはどうしたらよいですか?また、シェイクの方向はどのように検出するのでしょうか?

手ぶれ時にimageviewの画像を変更したいのですが。

どのように解決するのですか?

コードの観点からは、SensorListenerを実装する必要があります。

public class ShakeActivity extends Activity implements SensorListener

SensorManagerを取得する必要があります。

sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);

そして、このセンサーを任意のフラグで登録します。

sensorMgr.registerListener(this,
SensorManager.SENSOR_ACCELEROMETER,
SensorManager.SENSOR_DELAY_GAME);

onSensorChange()メソッドでは、手ぶれかどうかを判断していますね。

public void onSensorChanged(int sensor, float[] values) {
  if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
    long curTime = System.currentTimeMillis();
    // only allow one update every 100ms.
    if ((curTime - lastUpdate) > 100) {
      long diffTime = (curTime - lastUpdate);
      lastUpdate = curTime;

      x = values[SensorManager.DATA_X];
      y = values[SensorManager.DATA_Y];
      z = values[SensorManager.DATA_Z];

      float speed = Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000;

      if (speed > SHAKE_THRESHOLD) {
        Log.d("sensor", "shake detected w/ speed: " + speed);
        Toast.makeText(this, "shake detected w/ speed: " + speed, Toast.LENGTH_SHORT).show();
      }
      last_x = x;
      last_y = y;
      last_z = z;
    }
  }
}

手ぶれ補正の閾値は次のように定義されています。

private static final int SHAKE_THRESHOLD = 800;

他にも、手ぶれを検出する方法はいくつかあります。 のリンクです。 (リンクがうまくいかない場合やリンク切れの場合は このウェブアーカイブを見る .).

これを見てください の例です。 を見てください。

注意 SensorListener は非推奨です。 SensorEventListener を使うことができます。 SensorEventListenerを使った簡単な例です。

ありがとうございます。