Android SensorManager strange how to remapCoordinateSystem

前端 未结 5 1786
感情败类
感情败类 2020-12-12 16:57

API Demos -> Graphics -> Compass

It works properly only, until you don\'t change the device natural orientation. In most phones is the portrait and most 10 inch tabl

5条回答
  •  孤城傲影
    2020-12-12 17:12

    This is how I do the magic in my application:

            float[] rotationMatrixOrig = new float[9];
            SensorManager.getRotationMatrix(rotationMatrixOrig, null, lastAccelerometerValue, lastMagnetometerValue);
    
            int screenRotation = app.getCurrentActivity().getWindowManager().getDefaultDisplay().getRotation();
            int axisX, axisY;
            boolean isUpSideDown = lastAccelerometerValue[2] < 0;
    
            switch (screenRotation) {
                case Surface.ROTATION_0:
                    axisX = (isUpSideDown ? SensorManager.AXIS_MINUS_X : SensorManager.AXIS_X);
                    axisY = (Math.abs(lastAccelerometerValue[1]) > 6.0f ? 
                            (isUpSideDown ? SensorManager.AXIS_MINUS_Z : SensorManager.AXIS_Z) :
                            (isUpSideDown ? SensorManager.AXIS_MINUS_Y : SensorManager.AXIS_Y));
                    break;
                case Surface.ROTATION_90:
                    axisX = (isUpSideDown ? SensorManager.AXIS_MINUS_Y : SensorManager.AXIS_Y);
                    axisY = (Math.abs(lastAccelerometerValue[0]) > 6.0f ? 
                            (isUpSideDown ? SensorManager.AXIS_Z : SensorManager.AXIS_MINUS_Z) :
                            (isUpSideDown ? SensorManager.AXIS_X : SensorManager.AXIS_MINUS_X));
                    break;
                case  Surface.ROTATION_180:
                    axisX = (isUpSideDown ? SensorManager.AXIS_X : SensorManager.AXIS_MINUS_X);
                    axisY = (Math.abs(lastAccelerometerValue[1]) > 6.0f ? 
                            (isUpSideDown ? SensorManager.AXIS_Z : SensorManager.AXIS_MINUS_Z) :
                            (isUpSideDown ? SensorManager.AXIS_Y : SensorManager.AXIS_MINUS_Y));
                    break;
                case Surface.ROTATION_270:
                    axisX = (isUpSideDown ? SensorManager.AXIS_Y : SensorManager.AXIS_MINUS_Y);
                    axisY = (Math.abs(lastAccelerometerValue[0]) > 6.0f ? 
                            (isUpSideDown ? SensorManager.AXIS_MINUS_Z : SensorManager.AXIS_Z) :
                            (isUpSideDown ? SensorManager.AXIS_MINUS_X : SensorManager.AXIS_X));
                    break;
                default:
                    axisX = (isUpSideDown ? SensorManager.AXIS_MINUS_X : SensorManager.AXIS_X);
                    axisY = (isUpSideDown ? SensorManager.AXIS_MINUS_Y : SensorManager.AXIS_Y);
            }
    
            float[] rotationMatrix = new float[9];
            SensorManager.remapCoordinateSystem(rotationMatrixOrig, axisX, axisY, rotationMatrix);
    

提交回复
热议问题