2012-10-26 13 views
5

Próbuję napisać plik .apk, aby zmierzyć, jak długo trzeba obrócić ekran urządzenia z systemem Android (przechodząc przez kilka obrotów).Wiesz, kiedy kończy się obracanie za pomocą metody setRequestedOrientation

Używam wywołań setRequestedOrientation() do reoriente ekranie w 4 pozycjach (PORTRAIT, LANDSCAPE, REVERSE_PORTRAIT i REVERSE_LANDSCAPE).

Mój problem polega na tym, że nie jestem w stanie stwierdzić, kiedy obrót się zakończył. Próbowałem kilku rozwiązań, ale każdy ma swoje problemy.

  1. Próbowałem użyć . Problem polega na tym, że ta metoda jest wyzwalana, gdy zmiana orientacji odbywa się z czujnika, a nie z setRequestedOrientation(). Muszę zadzwonić pod numer setRequestedOrientation() z parametrem FULL_SENSOR do onConfigurationChanged, aby działał po poprzednim połączeniu z setRequestedOrientation().
  2. Próbowałem dokonać pewnego rodzaju "blokowania", dodając pętlę while, aby sprawdzić orientację ekranu (w stopniach). Zadzwoniłem pod numer android.view.Display.getRotation() przed setRequestedOrientation() i zablokowałem z pętlą while, dopóki się nie zmieni. Niestety, to też nie działa. Powraca przed ponownym wyświetleniem interfejsu użytkownika.
  3. Próbowałem śledzić cykl życia aktywności, czekając, aż onCreate() zostanie ponownie wywołane, aby założyć, że obrót został wykonany. Poprzednio zapętlałem się, dopóki mój licznik nie osiągnął wartości, w każdej iteracji wywołującej setRequestedOrientation(). W tym scenariuszu pętla while staje się instrukcją if i zakładam, że onCreate wywoła funkcję za każdym razem, ale onCreate() nie zostanie wywołane po kilku iteracjach. Wygląda na to, że interfejs użytkownika nie jest również przerysowywany.
  4. Ostatecznym rozwiązaniem, które znalazłem w Internecie (ale nie udało mi się w pełni wdrożyć), jest użycie metody waitForIdleSync() zaraz po setRequestedOrientation(). waitForIdleSync() jest częścią klasy Instrumentation i myślę, że jest to zrobione tylko do testowania, a nie do standardowego pakietu .apk.

Wszelkie pomysły byłyby naprawdę mile widziane. Będę naprawdę wdzięczny za pomoc.

Odpowiedz

0

Nie można bezpośrednio ustalić, kiedy setRequestedOrientation() zakończyło działanie za pośrednictwem interfejsu API Androida. Jedynym sposobem, aby się dowiedzieć, jest sprawdzenie aktualnej orientacji przed wywołaniem go i po wywołaniu go w onCreate().

W swojej klasie Activity zrobić:

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); 
} 
Powiązane problemy