重新映射传感器坐标

Rya*_*yan 1 android orientation

我想要发生的是,当手机远离它的"自然"方向时,重新映射坐标系.因此,当使用手机时,它应该是横向的,它应该读取相同的值,就好像它是以肖像方式保存一样.

我正在检查旋转是否等于Surface.ROTATION_90,如果是,则重新映射坐标系.

我承认我不太了解如何正确地做到这一点,并且可以使用一些指导.

因此,您需要运行以下两种方法:

SensorManager.getRotationMatrix(inR, I, grav, mag); 
SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_Y,SensorManager.AXIS_MINUS_X, outR);
Run Code Online (Sandbox Code Playgroud)

传递这些方法需要什么?我创建了一个新的float数组,然后只将orientationsensor数据传递给了mag字段,这个字段无效.所以,我注册了加速度计和磁场传感器.从这两个getRotatioMatrix方法中获取数据,我总是得到一个NullPointerException(尽管JavaDoc说一些参数可以为null).我甚至尝试将数据传递给每个参数,但仍然有一个NullPointerException.

我的问题是,我需要传递给getRotationMatrix方法的正确数据是什么?

Sim*_*mon 6

我发现执行此操作的一种非常简单的方法是SDK示例AccelerometerPlay中使用的方法.

首先你得到这样的显示,例如onResume():

WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mDisplay = windowManager.getDefaultDisplay();
Run Code Online (Sandbox Code Playgroud)

然后在onSensorChanged()中你可以使用这个简单的代码:

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
        return;

    switch (mDisplay.getRotation()) {
        case Surface.ROTATION_0:
            mSensorX = event.values[0];
            mSensorY = event.values[1];
            break;
        case Surface.ROTATION_90:
            mSensorX = -event.values[1];
            mSensorY = event.values[0];
            break;
        case Surface.ROTATION_180:
            mSensorX = -event.values[0];
            mSensorY = -event.values[1];
            break;
        case Surface.ROTATION_270:
            mSensorX = event.values[1];
            mSensorY = -event.values[0];
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助.