25

わからない人のために動画で解説


この回答は正しくありません。別の解決策で回答してみてください (100 報奨金は期限切れです)

同じ質問ですが、よりよく説明されています

この質問は正解として受け入れられましたが、まったく違います。古いデバイス ZTE で試してみましたが、ほとんどの場合は機能しましたが、現在は Samsung Galazy A5 2016 を使用していますが、LG G3 でも機能しません。 .

物事は使用しようとしており、ビデオで行った2つの動きのいずれかを検出できる必要がありますAccelerometer.Sensors

2 つの動きがあります。

  • それを粉砕する(少しの速度で)
  • フリーフォール

ほとんどのデバイスで機能するという意味で、より良いオプションとより簡単なオプションを決定して納得させることができます。

4

2 に答える 2

14

静止したデバイスの重力値は +9.81 で、これはデバイスの加速度 (0 m/s2 から重力 -9.81 m/s2 を差し引いたもの) に対応します。したがって、デバイスが静止状態から下に移動している場合、重力は 9.81 未満になります。自由落下装置の重力は 0 になります。

以下は、デバイスが下向きに動き始めるかどうかを判断する方法です。デバイスがすでに一定の速度で下向きに移動している場合、デバイスが下向きに移動しているかどうかを判断することはできません。この場合、下向きの加速度はなく、重力ノルムは約 9.81 である必要があるためです。

を使用する必要がありますTYPE_GRAVITY。デバイスに がない場合はTYPE_GRAVITY、ローパス フィルターTYPE_ACCELEROMETERを使用して重力ベクトルを取得します。

上記のように、固定デバイスの重力ベクトルはノルムが 9.81 に等しくなります。ただし、この値はデバイスによって若干異なります。したがって、最初にこの定常重力ノルムを決定する必要があります。これを行うには、TYPE_GRAVITY または TYPE_ACCELEROMETER に登録し、ユーザーにデバイスを平らにしてボタンを押すように依頼します。ボタンが押されると、アプリは onSensorChanged で重力のノルムを計算します。

private float mStationaryGravityNorm;
private float mDeviation = 0.01;
private float mCount;
private boolean mIsCalculatingStationGravityNorm = true;

Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener( {
    @Override
    public void onClick(View v) {
        // register sensor
    }
    });

@Override
public void onSensorChanged(SensorEvent event) {
// Will average out 100 gravity values.
if (mIsCalculatingStationGravityNorm) {
    if (mCount++ < 100) {
        mStationaryGravityNorm += Math.sqrt(event.values[0] * event.values[0] + event.values[1] * event.values[1] + event.values[2] * event.values[2]);
    } else {
        mStationaryGravityNorm /= 100;
        mIsCalculatingStationGravityNorm = false;
} else {
    float gravityNorm = Math.sqrt(event.values[0] * event.values[0] + event.values[1] * event.values[1] + event.values[2] * event.values[2]);
    if (gravityNorm < mStationaryGravityNorm - mDeviation) {
    // moving down
    }
}

PS上下に移動するには、重力を計算したいと思います。デバイスが静止している場合、重力ノルムは約 9.81 です (デバイスによって異なります)。デバイスが下に移動している場合、下向きの加速度があるため、重力ノルムは 9.81 未満になり、デバイスが上に移動している場合、重力ノルムは 9.81 を超えます。したがって、重力ノルムをこの静止重力ノルムと比較することで、デバイスが上下に移動しているかどうかがわかります。これは、デバイスの向きとは無関係です。TYPE_GRAVITY を使用すると精度が向上しますが、デバイスにこのタイプがない場合は、ローパス フィルター TYPE_ACCELERATOR を使用すると重力ベクトルが得られます。

于 2016-01-26T18:00:49.377 に答える
-1

デバイスが自由落下しているかどうかを確認したい場合は、法線がゼロに近いかどうかを確認する必要があります。 http://developer.android.com/guide/topics/sensors/sensors_motion.html

public void onSensorChanged(SensorEvent event) {
    double noraml = Math.sqrt(Math.pow(event.values[0].getX(),2)+
                    Math.pow(event.values[1].getY(),2)+
                    Math.pow(event.values[2].getZ(),2));
    if (normal < 0)
        return true;
    return false;

}
于 2016-01-26T15:30:54.723 に答える