我想发生的是,当手机从“自然”方向转开时,重新映射坐标系。因此,在使用手机且手机处于横向的情况下,它应该读取相同的值,就像是纵向握持一样。

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

我承认我不太了解如何正确执行操作,因此可以使用一些指导。

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

SensorManager.getRotationMatrix(inR, I, grav, mag);
SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_Y,SensorManager.AXIS_MINUS_X, outR);


传递给这些方法需要什么?我创建了一个新的float数组,然后仅将directionsensor数据传递到mag字段,但是这没有用。因此,我同时注册了加速度传感器和磁场传感器。将两者的数据馈送到getRotatioMatrix方法,我总是得到一个NullPointerException(即使JavaDoc说某些参数可以为空)。我什至尝试将数据传递给每个参数,但仍然得到一个NullPointerException

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

最佳答案

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

首先,您将获得这样的显示,例如在onResume()中:

WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mDisplay = windowManager.getDefaultDisplay();


然后在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;
    }
}


希望这会有所帮助。

关于android - 重新映射传感器坐标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10918948/

10-12 00:31