2

由于我没有在网上找到任何相关答案,因此我发布了一个关于使用加速度计检测 android 设备绕其轴旋转 360 度的问题。例如在横向模式下围绕 y 轴:假设在起始位置 y 值为 0(设备与地面平齐)。当手机向前旋转 90 度y = -10时,会产生 180 度向前倾斜y = 0、270 度向内倾斜y = +10和 360 度向内倾斜y = 0。那么代码如何仅在预先指定的方向上检测设备的完整转动呢?

@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
    // assign directions
    x = event.values[1];
    y = event.values[0];
    z = event.values[2];

        ???
    }
}

编辑: 已通过使用 getRotationMatrix() 方法成功。

private float[] r = new float[9];
private float[] i = new float[9];
private float[] v = new float[3];

private float[] accValues = new float[3];
private float[] geoValues = new float[3];

private int azimuth, pitch, roll;

@Override
public void onSensorChanged(SensorEvent event) {

    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        accValues = event.values.clone();
    }

    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
        geoValues = event.values.clone();
    }

    boolean success = SensorManager.getRotationMatrix(r, i, accValues,
        geoValues);

    if (success) {
        SensorManager.getOrientation(r, v);

        azimuth = v[0] * (180 / Math.PI);
        pitch = v[1] * (180 / Math.PI);
        roll = v[2] * (180 / Math.PI);
    }
}
4

1 回答 1

1

您可以尝试类似:

`
@覆盖

public void onSensorChanged(SensorEvent event) {

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

x = event.values[1];
y = event.values[0];
z = event.values[2];

if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
x1 = event.values[1];
y1 = event.values[0];
z1 = event.values[2];

}

}`

此代码应该允许您检测加速度和方向的变化,因此即使加速度计的 Y 值再次从 0 变为 0,因为方向发生了变化,然后有一个完整的旋转(但是,您仍然需要清洁此代码可消除手机向一个方向移动 180° 然后返回 180° 的情况(再次上下转动手机))

出于好奇,您为什么需要 360° 转动手机?我尝试将手机旋转 360°,这可不是件容易的事。

于 2013-07-02T08:59:26.820 回答