0

我正在尝试构建一个应用程序,该应用程序在设备倾斜到一定程度时会产生所需的影响。

我已经查看并成功启用了加速度计,但这并没有给我想要的效果。就像我说的,我希望设备做我想做的事,只有当设备达到一定程度时,比如 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_ACCELEROMETERSensor.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能够识别的代码?

请记住,我希望它能够知道何时越过该点,而不是何时进入该区域。

干杯!

4

1 回答 1

0

加速度计:“以 m/s2 为单位测量在所有三个物理轴(x、y 和 z)上应用于设备的加速力,包括重力。”

方向:“测量设备围绕所有三个物理轴(x、y、z)的旋转度数。从 API 级别 3 开始,您可以使用重力传感器和地磁场获取设备的倾斜矩阵和旋转矩阵传感器与 getRotationMatrix() 方法结合使用。”

于 2016-09-28T07:46:30.383 回答