9

当显示活动时,我应该从哪里开始AnimationDrawable需要动画?

开发人员指南建议使用onWindowFocusChanged,但当活动是TabHost.

我引用:

需要注意的是,在 Activity 的 onCreate() 方法期间不能调用 AnimationDrawable 上调用的 start() 方法,因为 AnimationDrawable 尚未完全附加到窗口。如果您想立即播放动画而不需要交互,那么您可能希望从 Activity 中的 onWindowFocusChanged() 方法调用它,当 Android 使您的窗口成为焦点时,该方法将被调用。

4

4 回答 4

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();
    }
});
于 2012-08-10T21:01:28.757 回答
6

并行线程方法似乎是最流行的一种方法,但它确实引发了两个主要问题:

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

因此,我建议使用名称非常恰当的 runOnUiThread() 方法。在 onResume() 中调用它会确保你的动画代码将在主线程上运行,它会在窗口附加后运行,你会知道消息将在哪里被处理并且没有小猫需要丢失它们的生活:

@Override
protected void onResume()
{
    super.onResume();
    runOnUiThread(new Runnable() 
    {
        @Override
        public void run() 
        {
            animation.start();
        }
    });
}
于 2011-02-07T11:57:22.963 回答
0

当ActivityonResume()进入前台时,总是会调用 Activity。尝试在那里启动它。

于 2010-07-19T18:59:19.003 回答
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) {
  }
});
于 2014-03-03T19:27:33.673 回答