2012-10-26 8 views
5

Sto provando a scrivere un .apk per misurare quanto tempo ci vuole per ruotare lo schermo di un dispositivo Android (eseguendo il ciclo di un paio di rotazioni).Sapere quando la rotazione è finita usando setRequestedOrientation

Sto usando le chiamate a setRequestedOrientation() al reoriente lo schermo in 4 posizioni (PORTRAIT, LANDSCAPE, REVERSE_PORTRAIT e REVERSE_LANDSCAPE).

Il mio problema è che non sono in grado di dire quando la rotazione è finita. Ho provato alcune soluzioni, ma ognuna ha i suoi problemi.

  1. Ho provato a utilizzare . Il problema è che questo metodo viene attivato quando il cambio di orientamento avviene dal sensore e non da setRequestedOrientation(). In realtà devo chiamare setRequestedOrientation() con il parametro FULL_SENSOR per onConfigurationChanged per funzionare dopo la mia precedente chiamata a setRequestedOrientation().
  2. Ho provato a fare il "blocco" setRequestedOrientation() aggiungendo un ciclo while per controllare l'orientamento dello schermo (in gradi). Ho chiamato android.view.Display.getRotation() prima del setRequestedOrientation() e blocco con un ciclo while finché non è stato modificato. Sfortunatamente, non funziona neanche. Ritorna prima che l'interfaccia utente venga nuovamente visualizzata.
  3. Ho provato a seguire il ciclo di vita dell'attività, attendendo che onCreate() venga richiamato, per supporre che la rotazione sia stata eseguita. In precedenza, stavo effettuando un ciclo finché il mio contatore non ha raggiunto un valore, in ciascuna iterazione che chiama setRequestedOrientation(). In questo scenario, il mio ciclo while diventa un'istruzione if, e presumo che onCreate chiamerà la funzione ogni volta, ma onCreate() non viene chiamato dopo un paio di iterazioni. Anche l'interfaccia utente non sembra essere ridisegnata.
  4. Una soluzione finale che ho trovato online (ma che non sono stato completamente in grado di implementare) consiste nell'utilizzare il metodo waitForIdleSync() subito dopo setRequestedOrientation(). waitForIdleSync() fa parte della classe Instrumentation e penso che questo sia fatto solo per i test e non per un .apk standard.

Qualsiasi idea sarebbe davvero gradita. Apprezzerei molto il tuo aiuto.

risposta

0

Non esiste un modo diretto per sapere quando setRequestedOrientation() è terminato tramite l'API di Android. L'unico modo per sapere è controllare l'orientamento corrente prima di chiamarlo e dopo averlo chiamato in onCreate().

Nella classe Activity fare:

long timeStamp; 

public void onCreate(Bundle savedInstanceState) { 
    if (savedInstanceState == null) { 
      timeStamp = System.currentTimeMillis();  
    } 
    else { 
      timeStamp = savedInstanceState.getLong("state_time_stamp"); 
    } 

    // For example, check how long it takes to switch from portrait to landscape. 
    // You can modify this part to check PORTRAIT, LANDSCAPE, REVERSE_PORTRAIT and REVERSE_LANDSCAPE. 
    final int orientation = getResources().getConfiguration().orientation;  
    if (orientation == Configuration.SCREEN_ORIENTATION_PORTRAIT) { 
      setRequestedOrientation(ActivityInfo.ORIENTATION_LANDSCAPE); 
      return; 
    } 

    // We will reach here only after setRequestedOrientation() is done 
    // and here's the time it took to change the orientation: 
    final long elapsedTime = System.currentTimeMillis() - timeStamp; 
} 

public void onSaveInstanceState(Bundle outState) { 
    outState.putLong("state_time_stamp", timeStamp); 
} 
Problemi correlati