在Android中启动一个AnimationDrawable

我应该在哪里开始一个AnimationDrawable ,当显示活动时需要animation

开发人员指南build议使用onWindowFocusChanged ,但是当活动是onWindowFocusChanged一部分时,并不总是调用它。

我引用:

注意在AnimationDrawable上调用的start()方法不能在Activity的onCreate()方法中调用,因为AnimationDrawable尚未完全附加到窗口。 如果您想要立即播放animation,而不需要交互,那么您可能需要从Activity中的onWindowFocusChanged()方法调用该方法,这会在Android将窗口放到焦点上时调用。

Solutions Collecting From Web of "在Android中启动一个AnimationDrawable"

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

  • 根据文档,所有与UI相关的代码应该运行在主(又名“GUI”)线程上。 虽然在AnimationDrawable上调用.start()可能不被认为是纯粹的UI操作,但我仍然觉得它应该遵循这个规则。
  • 你永远不知道到底什么时候开始你的animation。 我已经看到了“魔术”延迟长度值的代码,应该解决这个问题。 每当程序员采取这种方法时,你应该知道神会杀死一只小猫。

所以,我build议使用非常恰当的名字runOnUiThread()方法。 在onResume()中调用它会向你保证你的animation代码将在主线程上运行,在窗口被连接之后它将运行,你将知道消息将在哪里被处理,并且没有小猫需要失去它们住:

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

我知道这个问题有点老,但这可能会有助于像我这样的问题在这个问题上发生。 我开始AnimationDrawable的一种方法是创build一个新的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(); } }); 

活动的onResume()总是在Activity到达前台时被调用。 尝试在那里开始。

根据文档,在开始animation之前,您必须等待视图附加到窗口。 因此,您应该添加一个OnAttachStateChangeListener到视图,它将在附加时执行,并从那里开始animation。

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