我正在跟踪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();
};
我看到的只是第一帧而没有其他图像。
答案 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));
}
}
要注意的要点是:
答案 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;
}
}