如何在onCreate之后立即启动动画?

时间:2011-09-02 22:32:15

标签: android android-animation

我正在跟踪http://developer.android.com/guide/topics/graphics/view-animation.html#frame-animation稍作修改。我决定制作动画循环并希望它从一开始就开始。

我的动画是在drawable / listening.xml:

<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item
    android:drawable="@drawable/l_01"
    android:duration="200" />
<item
    android:drawable="@drawable/l_02"
    android:duration="200" />
<item
    android:drawable="@drawable/l_03"
    android:duration="200" />
</animation-list>

和我的初始代码:

 @Override public void onWindowFocusChanged(boolean hasFocus)  { 
      super.onWindowFocusChanged(hasFocus); 
      animImg = (ImageView)findViewById(R.id.listen_anim);
      animImg.setBackgroundResource(R.drawable.listening);
      anim = (AnimationDrawable) animImg.getBackground(); 
      anim.start();
 };

我看到的只是第一帧而没有其他图像。

7 个答案:

答案 0 :(得分:46)

它已经写在教程中了:

重要的是要注意,在Activity的onCreate()方法中,无法调用在AnimationDrawable上调用的start()方法,因为AnimationDrawable尚未完全附加到窗口。 < / p>

如果你想立即播放动画而不需要交互,那么你可能想从你的Activity中的onWindowFocusChanged()方法调用它,当Android带来时它会被调用你的窗口成为焦点。

因此,根据您的意愿,将您的电话转移到这两个地方中的一个地方。根据您的评论,将您的通话移至 onWindowsFocusChanged()内。

修改 所以这是“怎么做”

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    if(hasFocus){
        textView.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,
            android.R.anim.slide_in_left|android.R.anim.fade_in));
    }   
}

要注意的要点是:

  • 不要忘记编写if / else案例来检查焦点
  • 并删除自动生成的“super.onWindowFocusChanged(hasFocus);

答案 1 :(得分:9)

onAttachedToWindow()中设置一个标记,然后在onWindowFocusChanged()中检查并启动动画。

@Override
void onWindowFocusChanged(boolean hasFocus) {
    if (hasFocus & mbFlag) {
        // start animation.
    }
}

更新

只需扩展ImageView类并覆盖onFocusChange方法即可。然后在您的活动中,通过调用animImg.requestFocus()将焦点设置为它。动画应该在聚焦时开始。确保您的图像视图是可聚焦的
如果这不起作用,您可能还想覆盖onAttachedToWindow()方法。在那里设置一个标志并在开始动画之前检查。

@Override
void onFocusChange(boolean hasFocus) {
    if (hasFocus) {
        // start animation.
    }
}

答案 2 :(得分:4)

您可以在活动中使用任何post的{​​{1}}方法。它应该看起来像这样:

View

答案 3 :(得分:0)

在开始动画之前,您需要给UI管理员留出时间来创建适当的资源。正确的模式是

a) Create animation object in onCreate.
b) Start animation object elsewhere.

不要以相同的方法创建和启动。

答案 4 :(得分:0)

由于这个问题是很久以前提出的,我在2019年遇到了使用Transitions-Everywhere或AndroidX Transitions的相同问题。 对我来说,唯一的解决方案是使用@Muzikant答案。 只需致电您的onCreate()

rootViewOfYourLayout.post {
            TransitionManager.beginDelayedTransition(rootViewOfYourLayout)
            someViewId.visibility = View.VISIBLE
        }

而且效果很好,例如在我的启动画面中。

更新
 经过一些测试,看来该解决方案存在较小问题。启动动画后,您将手机锁定或将应用程序移至后台,结果是应用程序再次进入前台时,由于没有收到TransitionListener回调而被冻结,因此在我的情况下,不会调用onTransitionEnd()定位用户的逻辑下一个屏幕。

现在这对我来说没有问题:

  override fun onWindowFocusChanged(hasFocus: Boolean) {
   if(hasFocus && isAnimationStarted.not()){
   rootViewOfYourLayout.post {
          TransitionManager.beginDelayedTransition(rootViewOfYourLayout)
          someViewId.visibility = View.VISIBLE
            }
  }
}

答案 5 :(得分:-1)

animation = AnimationUtils.loadAnimation(this, R.anim.push_left_out);

yourobject.startanimation(animation);

这可能会有所帮助

答案 6 :(得分:-17)

在onResume()中运行:

class AnimTask extends AsyncTask<String, String,String> {
            Activity act;
            AnimTask(Activity act) {
                this.act = act;
            }

            @Override
            protected String doInBackground(String... params) {
                act.runOnUiThread(new Runnable() {
                    public void run(){
                        animImg = (ImageView)findViewById(R.id.listen_anim);
                        animImg.setBackgroundResource(R.drawable.listening);
                        anim = (AnimationDrawable) animImg.getBackground();
                        anim.start();
                    }
                });
                return null;
            }
        }