2010-07-19 54 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) { 
    } 
});