java - Android getOrientation 问题 - 沿轴镜像值

标签 java android orientation

我在 getOrientation 方面遇到了一些麻烦。我正在横向模式下运行我的应用程序,但我在一个轴上遇到了麻烦。代码中有更多解释,一些图像:

enter image description here enter image description here

    valuesMagnet      = new float[3];
    valuesAccel       = new float[3];
    valuesOrientation = new float[3];
    rotationMatrix    = new float[9];
    rotationMatrixTemp= new float[9];

....


@Override
public void onSensorChanged(SensorEvent event) {


    switch (event.sensor.getType()) {
        case Sensor.TYPE_ACCELEROMETER:
            System.arraycopy(event.values, 0, valuesAccel, 0, 3);
            break;

        case Sensor.TYPE_MAGNETIC_FIELD:
            System.arraycopy(event.values, 0, valuesMagnet, 0, 3);
            break;
    }

    if (SensorManager.getRotationMatrix(rotationMatrixTemp, null, valuesAccel, valuesMagnet)) {
        //SensorManager.remapCoordinateSystem(rotationMatrixTemp, SensorManager.AXIS_X, SensorManager.AXIS_Z, rotationMatrix);
        SensorManager.getOrientation(rotationMatrix, valuesOrientation);

        for (int i = 0; i < valuesOrientation.length; i++) {
            valuesOrientation[i] /= Math.PI;
            valuesOrientation[i] *= 100;
            valuesOrientation[i] = (int)valuesOrientation[i];
            valuesOrientation[i] /= 100;
        }

        updateOrientationBuffer(valuesOrientation);

        quadcopter.onEvent(new Event(Event.Codes.ORIENTATION_CHANGED, calculateSmoothedOrientation()));
    }
    else {
        Log.d("App", "Matrix rotate error");
    }
}

我希望 orientation[1] 轴在将手机旋转 180 度时提供 -1 到 1 之间的全范围值。另外,目标设备没有陀螺仪。

最佳答案

@Override
public void onSensorChanged(SensorEvent event) {
    switch (event.sensor.getType()) {
        case Sensor.TYPE_ACCELEROMETER:
            System.arraycopy(event.values, 0, valuesAccel, 0, 3);
            break;

        case Sensor.TYPE_MAGNETIC_FIELD:
            System.arraycopy(event.values, 0, valuesMagnet, 0, 3);
            break;

        case Sensor.TYPE_GRAVITY:
            System.arraycopy(event.values, 0, valuesGravity, 0, 3);
            break;

        default:
            break;
    }

    if (SensorManager.getRotationMatrix(rotationMatrixTemp, null, valuesAccel, valuesMagnet)) {
        SensorManager.getOrientation(rotationMatrixTemp, valuesOrientation);

        if(valuesGravity[2] < 0)                                     {
            if (valuesOrientation[1] > 0) {
                valuesOrientation[1] = (float) (Math.PI - valuesOrientation[1]);
            }
            else {
                valuesOrientation[1] = (float) (-Math.PI - valuesOrientation[1]);
            }
        }

        for (int i = 0; i < valuesOrientation.length; i++) {
            valuesOrientation[i] /= Math.PI;
            valuesOrientation[i] *= 100;
            valuesOrientation[i] = (int)valuesOrientation[i];
            valuesOrientation[i] /= 100;
        }


        updateOrientationBuffer(valuesOrientation);

        quadcopter.onEvent(new Event(Event.Codes.ORIENTATION_CHANGED, calculateSmoothedOrientation()));
    }
    else {
        Log.d("Quadcopter-SM", "Matrix rotate error");
    }
}

关于java - Android getOrientation 问题 - 沿轴镜像值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19350009/

相关文章:

android - iScroll 在 Android 中不起作用,除非你改变方向并返回

java - 从 Web 应用程序发送 SMS

Java - 在一个映射中交换值和键?

Android Listview 搜索到特定位置

android - Google plus 登录访问 token 检索

javascript - 使用 JS 更改手机旋转的变量

ios - 如何以编程方式将 UIViewController 的方向更改为横向?

java - 在单个作业中将自定义对象从Map传递到Reduce

java - 没有 csv 的 split() 方法

java - System.currentTimeMillis() 是否返回 UTC 时间?