好的,有人提出了类似的问题,但没有任何答案可以解决我的问题。我已经尝试过Thread.sleep,还有延迟的runnable。使用处理程序等
我想使用相同的imageview显示一系列帧动画(AnimationDrawable),并根据需要更改背景动画。用户输入一系列5个动画,然后可以播放它们(如果我的程序有效)。一旦选择了动画,我使用包含if语句和switch语句的for循环来选择任何动画被选中并播放它们。
正如您可能想象的那样,这不能正常工作,因为程序会绕过for循环并且只有第一个和最后一个动画实际播放。以下是代码的要点:
for(i=0;i<5;i++){
if(conditions){
view.setBackground(chosenAnimation);
((AnimationDrawable)view.getBackground().start();
}
}
正如我所说的,我已经尝试过Thread.sleep(),它没有做我正在寻找的事情。我尝试过使用Handler类并对runnable进行延迟。我试过这个:
view.postDelayed(new Runnable() {
@Override
public void run() {
//works the same without this line
((AnimationDrawable)view.getBackground()).stop();
((AnimationDrawable)view.getBackground()).start();
}
}, 1000);
除了添加暂停之外,这些东西都没有做任何事情,除非在我添加这些内容之前做了完全相同的事情。我仔细调试了代码,一切正常。动画都经过了单独测试。
正如我所说,已经提出并回答了类似的问题,没有提供任何我想要的东西,这是为了让程序等到一个动画完成之后才再次运行for循环。
我想再次声明这是一系列使用AnimationDrawable和相同imageview的帧动画。提前谢谢!
答案 0 :(得分:2)
所有动画都将以相同的延迟启动,您应该通过将其乘以i来增加此延迟。您还可以以编程方式计算每个动画的持续时间,并根据需要增加延迟。
我只是试图达到你想要的效果并且没有问题,虽然我的例子使用了第三方库,但这并不是必需的。
package com.example.masktest.app;
import android.animation.Animator;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.concurrent.atomic.AtomicReference;
import static com.dtx12.android_animations_actions.actions.Actions.*;
public class MainActivity extends AppCompatActivity {
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.imageView);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
playAnimation();
}
});
}
private void playAnimation() {
final AnimationDrawable firstDrawable = (AnimationDrawable) ContextCompat.getDrawable(MainActivity.this, R.anim.anim_android);
final AnimationDrawable secondDrawable = (AnimationDrawable) ContextCompat.getDrawable(MainActivity.this, R.anim.anim_android_2);
final AtomicReference<Integer> cpt = new AtomicReference<>(0);
Animator sequence = repeat(6, sequence(run(new Runnable() {
@Override
public void run() {
if (imageView.getDrawable() instanceof AnimationDrawable) {
((AnimationDrawable) imageView.getDrawable()).stop();
}
imageView.setImageDrawable(cpt.get() % 2 == 0 ? secondDrawable : firstDrawable);
((AnimationDrawable) imageView.getDrawable()).start();
cpt.set(cpt.get() + 1);
}
}), delay(countAnimationDuration(secondDrawable))));
play(sequence, imageView);
}
private float countAnimationDuration(AnimationDrawable drawable) {
int duration = 0;
for (int i = 0; i < drawable.getNumberOfFrames(); i++) {
duration += drawable.getDuration(i);
}
return duration / 1000f;
}
}
答案 1 :(得分:1)
你可以简单地使用for循环而你不需要第三方库。
假设您有一个要动态添加这些按钮的LinearLayout(或任何视图组)。你可以这样做:
for (int i = 0; i < buttons.size(); i++) {
Button button = new Button(context);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
linearLayout.addView(button);
animateButton(button);
}
}, BUTTON_DELAY_DURATION * i);
}