2010-07-19 61 views
9

我應該在哪裏開始一個AnimationDrawable需要在顯示活動時進行動畫製作?在Android中啓動AnimationDrawable

開發人員指南recommends使用onWindowFocusChanged,但當活動是TabHost的一部分時,並不總是調用此方法。

我引述:

需要注意的是呼籲 AnimationDrawable的 start()方法無法將 活動的onCreate()方法中調用 ,因爲 AnimationDrawable不是很重要但完全連接到窗口 。如果你想 立即播放動畫, 不需要交互,那麼 你可能想從 onWindowFocusChanged()方法,在你的 活動調用它,當 Android將你的窗口,成爲關注的焦點,這將被調用。

回答

6

並行線程的方法似乎是最流行的一種,但它確實提出了兩個主要問題:

  • 根據該文檔,所有UI相關的代碼應在主運行(又名「GUI」)線。雖然在AnimationDrawable上調用.start()可能不被視爲純UI操作,但我仍然認爲它應遵循該規則。
  • 您永遠無法確切知道動畫何時開始。我已經看到了代碼中帶有「魔術」延遲長度值的應該解決這個問題的代碼。你應該知道,每當程序員採取這種方法時,上帝會殺死一隻小貓。

所以,我建議使用非常恰當的命名runOnUiThread()方法。在onResume()中調用它會向你保證你的動畫代碼將在主線程上運行,它會在附加窗口後運行,你會知道消息的確切處理地點,並且沒有小貓需要丟失它們生活:

@Override 
protected void onResume() 
{ 
    super.onResume(); 
    runOnUiThread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      animation.start(); 
     } 
    }); 
} 
0

當活動進入前臺時,總是調用活動的onResume()。嘗試在那裏開始。

+1

不起作用。看起來AnimationDrawable尚未完全附加到窗口。 – hpique 2010-07-19 19:05:52

7

我知道這個問題有點老了,但這可能會有助於像我這樣的問題發生在這個問題。我開始AnimationDrawable的一種方法是創建一個新的Runnable並使用ImageView中的post方法。

你可以這樣做:

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工作答案。 Vaiden的回答對我沒有用。 – 2013-03-27 20:29:18

+1

不適合我 – 2015-05-22 06:07:21

0

根據該文件,則必須等到視圖開始動畫之前貼在車窗。因此,您應該添加一個OnAttachStateChangeListener到視圖中,該視圖將在附加時執行,並從那裏開始動畫。

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) { 
    } 
});