如何检测手机旋转一周(360度)?

3

由于我在搜索网络时没有找到任何相关答案,所以我发布了一个问题,询问如何使用加速计检测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);
    }
}
1个回答

1
您可以尝试这样做:

`
@Override


该内容涉及编程,保留了HTML格式,并且不进行解释。
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°然后再回到原来方向的情况)

出于好奇,你为什么需要让手机旋转360°?我试着让我的手机旋转360°,这并不容易。


谢谢。你指引了我正确的方向,虽然我后来使用了getRotationMatrix方法并在这里阅读了相关线程。为什么要进行360度旋转?只是为了创新。 - Uroš Trstenjak
很高兴我能提供帮助。祝你的项目好运。 - user2497624

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接