在Android中启动AnimationDrawable

hpi*_*que 9 animation android drawable android-tabhost

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

开发人员指南建议使用onWindowFocusChanged,但当活动是a的一部分时,并不总是调用此方法TabHost.

我引用:

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

Dav*_*ave 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();
    }
});
Run Code Online (Sandbox Code Playgroud)


Vai*_*den 6

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

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

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

@Override
protected void onResume()
{
    super.onResume();
    runOnUiThread(new Runnable() 
    {
        @Override
        public void run() 
        {
            animation.start();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)