2011-01-19 19 views
9

voglio forzare l'orientamento dello schermo in orizzontale sul pulsante click impostandoorientamento dello schermo Android al sensore

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

Funziona benissimo. Ora voglio che l'applicazione segua il sensore in modo che l'orientamento venga riportato in verticale quando viene inclinato di nuovo in verticale. So che questo è possibile impostando setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); ma non sai dove impostarlo. Se l'orientamento è forzato a orizzontale, l'orientamento rimarrà in orizzontale, indipendentemente dall'inclinazione in qualsiasi direzione. Qualcuno può specificare come reimpostare il flag di orientamento?

risposta

1

Dipende da quando si desidera che il sensore rilevi nuovamente la rotazione.

Personalmente in un app che sto sviluppando ho una specifica attività in cui ho bisogno di essere in modalità verticale, per cui uso setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); nel onResume() di questa attività e setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); in onPause() e funziona bene, quando entro il attività imposta su ritratto se non lo è e non consente di cambiare e all'uscita il sensore funziona di nuovo ...

Dove stai cercando di abilitare e disabilitare il sensore?

+0

La mia applicazione è in modalità verticale per impostazione predefinita. L'utente può passare alla modalità orizzontale facendo clic su un pulsante o inclinando il dispositivo. Ma in modalità orizzontale, non c'è modo di riportare l'attività in modalità verticale. Se è necessario fornire un altro pulsante per forzare l'orientamento in verticale, questa sarà l'ultima opzione. Volevo sapere se è possibile impostare la modalità sensore dopo la forzatura in orizzontale. Ho provato la tua opzione t impostata sulla modalità sensore in pausa, ma tornerà alla modalità verticale quando voglio forzare in modalità orizzontale quando il dispositivo è in modalità verticale. – Kulai

4

penso che qui si dovrebbe usare setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)

7

attuale app YouTube fa quello che stai chiedendo.
Mi sono occupato dello stesso tipo di problema nella mia applicazione per la riproduzione di video.

Se le forze utente orientamento orizzontale quando lui/lei era in ritratto, inizializzare OrientationEventListener che notifica sull'orientamento dispositivo da SensorManager che va da 0 a 360.

Guarda se il dispositivo si inclina alla gamma orientamento orizzontale che sarebbe intorno (orientation >= 60 && orientation <= 120) || (orientation >= 240 && orientation <= 300) e salva questo stato su enum o su una bandiera e poi se il dispositivo torna alla gamma di orientamento verticale (orientation <= 40 || orientation >= 320), controlla enum/flag e chiama setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);, reimposta il flag/enum e disabilita il sensore fino a quando l'utente forza nuovamente l'orientamento.

ecco il codice 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(); 
} 

questo ha funzionato simile alla funzionalità di YouTube, spero che questo aiuta.

+0

Questo era esattamente quello che stavo cercando: un modo per emulare ciò che l'app di YouTube stava facendo! Grazie :) – wblaschko

+0

il suo lavoro perfettamente :) – Meenaxi

Problemi correlati