Android естественная помощь датчика ориентации - PullRequest
4 голосов
/ 07 июля 2011

Я пытаюсь выполнить рекомендованный Reto Meier способ предотвращения изменения ориентации экрана. Слайды из его выступления во время Google IO (см. # 23) можно найти в Android Protips: где скачать слайды и фрагменты кода .

Я прошел по коду и установил значения, но ориентация экрана все еще меняется. К вашему сведению, я регистрирую этого слушателя в приложении.

Вот мой код:

final SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    sm.registerListener(
        new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent sensorEvent) {
                if (sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION) {
                    final WindowManager wm = (WindowManager) getApplicationContext()
                            .getSystemService(Context.WINDOW_SERVICE);
                    final Display display = wm.getDefaultDisplay();

                    int x = SensorManager.AXIS_X;
                    int y = SensorManager.AXIS_Y;

                    switch (display.getRotation()) {
                    case Surface.ROTATION_90:
                        x = SensorManager.AXIS_Y;
                        y = SensorManager.AXIS_MINUS_X;

                        break;
                    case Surface.ROTATION_180:
                        y = SensorManager.AXIS_MINUS_Y;

                        break;
                    case Surface.ROTATION_270:
                        x = SensorManager.AXIS_MINUS_Y;
                        y = SensorManager.AXIS_MINUS_X;

                        break;
                    case Surface.ROTATION_0:
                    default:
                        break;
                    }

                    SensorManager.remapCoordinateSystem(sensorEvent.values, x, y, new float[] {});
                }
            }

            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {

            }
        }, sm.getDefaultSensor(Sensor.TYPE_ORIENTATION),
        SensorManager.SENSOR_DELAY_NORMAL);

1 Ответ

12 голосов
/ 08 июля 2011

Все 30+ строк кода, которые в настоящее время не работают, могут быть заменены некоторыми значениями XML в вашем файле AndroidManifest.xml.

Мы все видели

<activity android:name=".YourActivity" android:screenOrientation="portrait" ></activity>

, и мы всеЗнайте, что это плохо работает с планшетами, которые имеют стандартную ориентацию ландшафта.Но как многие из вас видели это?

<activity android:name=".YourActivity" android:screenOrientation="nosensor" ></activity>

По сути это делает так, чтобы ориентация устройства не реагировала на датчик.Так что, если вы по умолчанию используете альбомную или книжную ориентацию, она не изменится.Я проверил его на своем Droid X и на Xoom , и он работает так, как я и ожидал.

Надеюсь, это поможет другим.

...