2010-07-19 13 views
9

Gdzie powinienem rozpocząć AnimationDrawable, który musi animować, kiedy aktywność jest pokazywana?Uruchamianie AnimationDrawable w systemie Android

Poradnik programisty recommends przy użyciu , ale nie zawsze jest wywoływany, gdy czynność jest częścią TabHost.

cytuję:

Ważne jest, aby pamiętać, że metoda start() wezwał AnimationDrawable nie można nazwać podczas metody onCreate() swojej działalności , ponieważ AnimationDrawable nie jest ale w pełni dołączony do okna. Jeśli chcesz natychmiast odtworzyć animację, bez konieczności interakcji, a następnie może chcesz wywołać ją od metody onWindowFocusChanged() w swojej działalności , które będą wywoływane podczas Android przynosi okno ostrość.

Odpowiedz

6

Podejście wątek równoległy wydaje się być najbardziej popularny, ale ma podnieść 2 głównych zagadnień:

  • Zgodnie z docs, wszystkie UI związany kod powinien działać na głównej (aka „GUI”) wątek. Podczas wywoływania .start() na AnimationDrawable może nie być uważana za czystą operację interfejsu użytkownika, ale nadal uważam, że powinna przestrzegać tej reguły.
  • Nigdy nie wiadomo dokładnie, kiedy rozpocznie się animacja. Widziałem kod z "magicznymi" wartościami opóźnienia, które miały to naprawić. Powinieneś wiedzieć, że Bóg zabija kociaka za każdym razem, gdy programista przyjmuje takie podejście.

Proponuję więc użyć bardzo trafnie nazwanej metody runOnUiThread(). Wywołanie go w onResume() zapewni, że twój kod animacji będzie działał w głównym wątku, że uruchomi się po podłączeniu okna, będziesz wiedział, gdzie dokładnie wiadomość ma zostać przetworzona i żadne kocięta nie muszą stracić mieszka:

0

Aktywność onResume() jest wywoływana zawsze, gdy działanie pojawia się na pierwszym planie. Spróbuj uruchomić go tam.

+1

Nie działa. Wygląda na to, że AnimationDrawable nie jest jeszcze w pełni przywiązany do okna. – hpique

7

Wiem, że to pytanie jest trochę stare, ale może być pomocne dla kogoś, kto ma takie samo pytanie, jak ja. Jednym ze sposobów uruchomienia AnimationDrawable jest utworzenie nowego trybu Runnable i użycie metody post z ImageView.

Można zrobić tak:

ImageView spinner = (ImageView) findViewById(R.id.my_imageView); 
spinner.setBackgroundResource(R.drawable.spinner); 
spinner.post(new Runnable() { 
    public void run() { 
     AnimationDrawable anim = (AnimationDrawable) spinner.getBackground(); 
     anim.start(); 
    } 
}); 
+0

+1 za odpowiedź służbową. Odpowiedź Vaidena nie działa dla mnie. –

+1

nie działa dla mnie –

0

Zgodnie z dokumentacją, trzeba czekać aż widok jest przymocowany do okna przed rozpoczęciem animacji. Dlatego powinieneś dodać widok OnAttachStateChangeListener do widoku, który będzie wykonywany po dołączeniu, i zacznij animację z tego miejsca.

ImageView loadingImg = (ImageView)v.findViewById(R.id.image); 
loadingImg.setBackgroundResource(R.drawable.progressdialog); 
loadingImg.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { 
    @Override 
    public void onViewAttachedToWindow(View v) { 
    AnimationDrawable loadingAnimation = (AnimationDrawable) v.getBackground(); 
    loadingAnimation.start(); 
    } 

    @Override 
    public void onViewDetachedFromWindow(View v) { 
    } 
}); 
Powiązane problemy