デバイスがある程度傾いたときに望ましい効果を発揮するアプリケーションを構築しようとしています。
加速度計を調べて、正常に有効にしましたが、これでは期待した効果が得られません。私が言ったように、デバイスが特定の角度、たとえば 90 度を達成したときにのみ、デバイスがやりたいことを実行することを望みます。
次のコードがありますが、これはデバイスが十分に速く傾いている場合にのみ機能します。
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
Sensor mySensor = sensorEvent.sensor;
if (mySensor.getType() == Sensor.TYPE_GYROSCOPE) {
float x = sensorEvent.values[0];
float y = sensorEvent.values[1];
float z = sensorEvent.values[2];
long currTime = System.currentTimeMillis();
if ((currTime - lastUpdate) > 100) {
long diffTime = (currTime - lastUpdate);
lastUpdate = currTime;
float speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000;
if (speed > SHAKE_THRESHOLD && !sound.isPlaying()) {
sound.start();
}
last_x = x;
last_y = y;
last_z = z;
}
}
}
このコードはもともと加速度計で使用されていましたが、 を に変更しただけで、Sensor.TYPE_ACCELEROMETER
何Sensor.TYPE_GYROSCOPE
をすべきかが明らかになることを願っています。
私はこのようなことをすることができますか?
if (x > 90 || y > 90 || z > 90 && !sound.isPlaying()) {
sound.start();
}
私の代わりに
if (speed > SHAKE_THRESHOLD && !sound.isPlaying()) {
sound.start();
}
このようなことを行う方法の例を探してみましたが、Android Developers でも何も見つかりませんでした...
デバイスが特定の角度またはラジアンに達したときに、速度は関係ありません。
どんな助けでも素晴らしいでしょう。
ありがとう!
ネイサン
編集:
私はこれをやった:
if (z > 5 || z < -5 || x > 5 || x < -5 && !sound.isPlaying()) {
sound.start();
} else if ( z == 4 || x == 4) {
sound.stop();
sound = MediaPlayer.create(this, R.raw.sound);
}
そして、これはある程度機能します。Z 値と X 値がしきい値の「5」を超えると、サウンドが再生されます。しかし、デバイスをその位置に置いたままにしておくと、デバイスを開始位置に戻すと、まだ「5」のしきい値内にあるため、サウンドが再びアクティブになります。
これは私が探していたものではないので、少し違うことを試してみようと思いました:
if (z == 5 || z == -5 || x == 5 || x == -5 && !sound.isPlaying()) {
sound.start();
} else if ( z == 4 || x == 4) {
sound.stop();
sound = MediaPlayer.create(this, R.raw.sound);
}
これはまったく機能しません。
デバイスが「5」のしきい値を超えたことを検出できるようにしたいのですが、移動してもしきい値内にある場合にサウンドを再び開始できるようにしたくありません。
基本的に、デバイスがラインを越えたときにサウンドを再生できるようにしたいのですが、ラインの後の任意のポイントではありません。番号がいつそれを行うかを調べさせると思いました== 5
が、それはできないようです。
ストップ機能も全く効きません。==
全然使ったらダメ。Javaが認識できるようにコーディングできる別の方法はありますか?
エリアに入ったときではなく、ポイントが交差したときにそれを認識できるようにしたいことを忘れないでください。
乾杯!