静止したデバイスの重力値は +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 を使用すると重力ベクトルが得られます。