2011-01-19 25 views
9

Chcę wymusić orientację ekranu na poziomą na kliknięcia przycisku przez ustawienieAndroid orientacji ekranu czujnika

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

to działa dobrze. Teraz chcę, aby aplikacja podążała za czujnikiem, aby orientacja została przywrócona do portretu po przechyleniu z powrotem do portretu. Wiem, że jest to możliwe, ustawiając setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);, ale nie wiem, gdzie to ustawić. Jeśli orientacja zostanie wymuszona, orientacja pozostanie w krajobrazie, niezależnie od tego, czy przechylisz się w dowolnym kierunku. Czy ktoś może określić, jak zresetować flagę orientacji?

Odpowiedz

1

To zależy od tego, kiedy czujnik ma ponownie wykryć obrót.

Osobiście w aplikacji jestem rozwijająca Mam jedną specyficzną aktywność gdzie muszę być w trybie portretowym, więc używam setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); w onResume() tej działalności i setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); w onPause() i działa dobrze, kiedy wprowadzić aktywność ustawia na portret, jeśli nie jest i nie pozwala na zmianę, a po wyjściu z czujnika działa ponownie ...

Gdzie próbujesz włączyć lub wyłączyć czujnik?

+0

Moja aplikacja jest domyślnie w trybie portretu. Użytkownik może przejść do trybu poziomego klikając przycisk lub przechylając urządzenie. Ale w trybie poziomym nie ma możliwości przywrócenia aktywności do trybu portretu. Jeśli trzeba podać inny przycisk, aby wymusić orientację na portret, będzie to ostatnia opcja. Chciałem wiedzieć, że można ustawić tryb czujnika po wymuszeniu pejzażu. Próbowałem Twojej opcji t ustawionej na tryb czujnika w trybie pauzy, ale powróci ona do trybu portretowego, kiedy chcę wymusić tryb poziomy, gdy urządzenie jest w trybie portretu. – Kulai

4

myślę tu należy użyć setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)

7

Aktualny aplikacja YouTube robi co prosicie.
Mam do czynienia z tego samego rodzaju problem w mojej aplikacji do odtwarzania wideo.

Jeśli orientacja siły użytkownika do krajobrazu, gdy on/ona była w układzie pionowym, zainicjować OrientationEventListener który informuje nas o orientacji urządzenia z SensorManager który waha się od 0 do 360.

Watch jeśli urządzenie plandeki do zakresu orientacji poziomej, co byłoby około (orientation >= 60 && orientation <= 120) || (orientation >= 240 && orientation <= 300) i zapisz ten stan na wyliczenie lub flagę, a następnie, jeśli urządzenie powróci do zakresu orientacji pionowej (orientation <= 40 || orientation >= 320), sprawdź enum/flag i zadzwoń pod numer setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);, zresetuj flagę/enum i wyłącz sensor, dopóki użytkownik ponownie nie wymusi orientacji.

Oto kod demo:

private enum SensorStateChangeActions { 
     WATCH_FOR_LANDSCAPE_CHANGES, SWITCH_FROM_LANDSCAPE_TO_STANDARD, WATCH_FOR_POTRAIT_CHANGES, SWITCH_FROM_POTRAIT_TO_STANDARD; 
} 

private SensorStateChangeActions mSensorStateChanges; 

public void goFullScreen() { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
     mSensorStateChanges = SensorStateChangeActions.WATCH_FOR_LANDSCAPE_CHANGES; 
     if (null == sensorEvent) 
      initialiseSensor(true); 
     else 
      sensorEvent.enable(); 
} 

public void shrinkToPotraitMode() { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     mSensorStateChanges = SensorStateChangeActions.WATCH_FOR_POTRAIT_CHANGES; 
     if (null == sensorEvent) 
      initialiseSensor(true); 
     else 
      sensorEvent.enable(); 
} 
/** 
* Initialises system sensor to detect device orientation for player changes. 
* Don't enable sensor until playback starts on player 
* 
* @param enable if set, sensor will be enabled. 
*/ 
private void initialiseSensor(boolean enable) { 
    sensorEvent = new OrientationEventListener(this, 
      SensorManager.SENSOR_DELAY_NORMAL) { 

     @Override 
     public void onOrientationChanged(int orientation) { 
      /* 
      * This logic is useful when user explicitly changes orientation using player controls, in which case orientation changes gives no callbacks. 
      * we use sensor angle to anticipate orientation and make changes accordingly. 
      */ 
      if (null != mSensorStateChanges 
        && mSensorStateChanges == SensorStateChangeActions.WATCH_FOR_LANDSCAPE_CHANGES 
        && ((orientation >= 60 && orientation <= 120) || (orientation >= 240 && orientation <= 300))) { 
       mSensorStateChanges = SensorStateChangeActions.SWITCH_FROM_LANDSCAPE_TO_STANDARD; 
      } else if (null != mSensorStateChanges 
        && mSensorStateChanges == SensorStateChangeActions.SWITCH_FROM_LANDSCAPE_TO_STANDARD 
        && (orientation <= 40 || orientation >= 320)) { 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
       mSensorStateChanges = null; 
       sensorEvent.disable(); 
      } else if (null != mSensorStateChanges 
        && mSensorStateChanges == SensorStateChangeActions.WATCH_FOR_POTRAIT_CHANGES 
        && ((orientation >= 300 && orientation <= 359) || (orientation >= 0 && orientation <= 45))) { 
       mSensorStateChanges = SensorStateChangeActions.SWITCH_FROM_POTRAIT_TO_STANDARD; 
      } else if (null != mSensorStateChanges 
        && mSensorStateChanges == SensorStateChangeActions.SWITCH_FROM_POTRAIT_TO_STANDARD 
        && ((orientation <= 300 && orientation >= 240) || (orientation <= 130 && orientation >= 60))) { 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
       mSensorStateChanges = null; 
       sensorEvent.disable(); 
      } 
     } 
    }; 
    if (enable) 
     sensorEvent.enable(); 
} 

To działało podobnie do funkcji YouTube nadzieję, że to pomaga.

+0

To było dokładnie to, czego szukałem: sposób naśladowania tego, co robiła aplikacja YouTube! Dzięki :) – wblaschko

+0

jego dzieło idealnie :) – Meenaxi

Powiązane problemy