按顺序播放帧动画。 Android的

时间:2015-09-08 00:07:50

标签: java android animation

好的,有人提出了类似的问题,但没有任何答案可以解决我的问题。我已经尝试过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的帧动画。提前谢谢!

2 个答案:

答案 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);
}