在Android中启动AnimationDrawable

时间:2010-07-19 18:56:42

标签: android animation android-tabhost drawable

在显示活动时,我应该在哪里开始需要动画的AnimationDrawable

使用onWindowFocusChanged的开发人员指南recommends,但当活动属于TabHost时,并不总是会调用此指南。

我引用:

  

重要的是要注意到   调用start()方法   无法调用AnimationDrawable   在你的onCreate()方法期间   活动,因为   AnimationDrawable尚未完全   附在窗户上。如果你想   立即播放动画,   然后,不需要互动   你可能想从中调用它   onWindowFocusChanged()方法在你的   活动,将在何时调用   Android让您的窗口成为焦点。

4 个答案:

答案 0 :(得分: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();
    }
});

答案 1 :(得分:6)

并行线程方法似乎是最受欢迎的方法,但它确实提出了两个主要问题:

  • 根据文档,所有与UI相关的代码都应该在主(a.k.a“GUI”)线程上运行。虽然在AnimationDrawable上调用.start()可能不被视为纯UI操作,但我仍然认为它应遵循该规则。
  • 您永远无法确切知道动画何时开始。我已经看到了具有“魔术”延迟长度值的代码,这些代码应该可以解决这个问题。每当程序员采用这种方法时,你应该知道上帝会杀死一只小猫。

所以,我建议使用非常恰当的命名runOnUiThread()方法。在onResume()中调用它将确保您的动画代码将在主线程上运行,它将在附加窗口后运行,您将知道消息将在何处处理,并且没有小猫需要丢失它们住:

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

答案 2 :(得分:0)

当Activity到达前台时,始终会调用Activity onResume()。尝试在那里开始。

答案 3 :(得分: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) {
  }
});