如何检测手机的一整圈(360度)?

时间:2013-07-02 08:35:15

标签: android rotation accelerometer

由于我没有在网上找到任何相关的答案,我发布了一个关于使用加速度计检测围绕其轴的 360度转动的问题。例如,在横向模式中围绕y轴:让我们说在起始位置y值为0(设备是平坦的到地面)。当手机向前旋转90度y = -10时,向前倾斜180度将导致y = 0y = +10倾斜270度,y = 0倾斜360度。那么代码如何仅在预先指定的方向上检测设备的这一整圈呢?

@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);
    }
}

1 个答案:

答案 0 :(得分:0)

您可以尝试以下方式:

`
    @override

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°,这不容易做到。