我正在尝试构建一个应用程序,该应用程序在设备倾斜到一定程度时会产生所需的影响。
我已经查看并成功启用了加速度计,但这并没有给我想要的效果。就像我说的,我希望设备做我想做的事,只有当设备达到一定程度时,比如 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 开发人员上......
我想要一些简单的东西,它可以让我知道设备何时达到一定程度或弧度,速度无关紧要。
任何帮助都会很棒。
谢谢!
弥敦道
编辑:
我已经这样做了:
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能够识别的代码?
请记住,我希望它能够知道何时越过该点,而不是何时进入该区域。
干杯!