Android アプリケーションを開発中ですが、1 つの軸を固定して移動方向を検出できるかどうか知りたいです。たとえば、携帯電話をテーブルに置いて、移動したときの方向 (左、右、上、下) を検出したいとします。距離は必要ではなく、正確な方向を知りたいだけです。
ベストアンサー1
はい。
を使用すると、SensorEventListener.onSensorChanged(SensorEvent event)
X 軸と Y 軸に沿って提供される値を特定できます。これらの値を記録し、メソッドへの後続の呼び出しで受け取る新しい値と比較してonSensorChanged
デルタ値を取得する必要があります。1 つの軸のデルタ値が正の場合、デバイスは一方向に移動しており、負の場合、反対方向に移動しています。
おそらく、加速度計イベントを受信するレートと、方向の変化を示すデルタ値を考慮するしきい値の両方を微調整する必要があるでしょう。
ここで私が話していることの簡単なコード例を示します。
public class AccelerometerExample extends Activity implements SensorEventListener {
TextView textView;
StringBuilder builder = new StringBuilder();
float [] history = new float[2];
String [] direction = {"NONE","NONE"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
textView = new TextView(this);
setContentView(textView);
SensorManager manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor accelerometer = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);
}
@Override
public void onSensorChanged(SensorEvent event) {
float xChange = history[0] - event.values[0];
float yChange = history[1] - event.values[1];
history[0] = event.values[0];
history[1] = event.values[1];
if (xChange > 2){
direction[0] = "LEFT";
}
else if (xChange < -2){
direction[0] = "RIGHT";
}
if (yChange > 2){
direction[1] = "DOWN";
}
else if (yChange < -2){
direction[1] = "UP";
}
builder.setLength(0);
builder.append("x: ");
builder.append(direction[0]);
builder.append(" y: ");
builder.append(direction[1]);
textView.setText(builder.toString());
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// nothing to do here
}
}
このコードは、携帯電話が移動した X 軸と Y 軸上の大まかな方向のみを提供します。方向をより細かく判断する場合 (たとえば、コンピューターのマウスの動きを模倣する場合)、携帯電話の加速度計が目的に適していない場合があります。
これを試すには、まずセンサーの遅延を設定しSensorManager.SENSOR_DELAY_FAST
、複数の履歴イベントのリストを作成して、時間の経過に伴う動きを検出できるようにし、このような細かいレベルで加速度計の測定を行うときによく発生する反対方向のわずかな動きの影響を受けないようにします。また、コメントで提案されているように、動きの正確な測定値を計算するために、経過した時間を測定する必要もあります。