使用处理程序检测动画的结束

时间:2015-09-24 12:42:06

标签: android android-handler

在下面的代码中,我有3个图像存储在cat lines | grep "xz" 中。我使用处理程序动画图像,但它不断循环,我希望它只运行动画一次。

我想要做的是看它是否到达第3张图片,然后停止动画。

imageArray

4 个答案:

答案 0 :(得分:1)

您是否考虑使用Drawable Animation而不是Handler

你基本上在xml中创建一个动画集,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/pl1" android:duration="300" />
    <item android:drawable="@drawable/pl2" android:duration="300" />
    <item android:drawable="@drawable/pl3" android:duration="300" />
</animation-list>

让我们调用此文件animation_drawable.xml并将其放在drawable文件夹中。然后,只需使用以下代码即可开始动画:

final AnimationDrawable drawable = (AnimationDrawable) getResources().getDrawable(R.drawable.animation_drawable);
image1.setImageDrawable(drawable);
drawable.start();

image1.postDelayed(new Runnable() {
    @Override
    public void run() {
        image1.clearAnimation();
        // Handle your animation ending here
    }
}, drawable.getDuration());

那就是它!我知道这是一个黑客解决方案,但我的事情Drawable动画使代码更清晰,更紧凑,但是听动画结束需要一些解决方法。

答案 1 :(得分:0)

尝试更改

i++;
if (i > imageArray.length - 1) {
    i = 0;
}
handler.postDelayed(this, 300);

if (i < imageArray.length - 1) {
    handler.postDelayed(this, 300);
}
i++;

答案 2 :(得分:0)

每次传递后,您的Runnable代码会将自身发布到处理程序中。只需在i=0;变量大于或等于数组大小时设置i - 从run()方法返回。它不会达到handler.postDelayed(this, 300),因此不会显示下一帧。

样品:

    final int[] imageArray = {R.drawable.ic, R.drawable.ic, R.drawable.ic};
    final Handler handler = new Handler();
    final Runnable runnable = new Runnable() {
        private int i = 0;

        @Override
        public void run() {
            i++;
            if(i > imageArray.length - 1) {
                Log.e("ASD", "Done");
                return;
            }
            Log.e("ASD", "Preparing next iteration");
            handler.postDelayed(this, 300);
        }
    };

    handler.postDelayed(runnable, 500);

无论如何,这不是提供帧动画的最佳方式。

答案 3 :(得分:0)

仅在未到达图像阵列的末尾时安排Runnable:

public void run() {
    image1.setImageResource(imageArray[i]);

    i++;
    if (i < imageArray.length) {
        handler.postDelayed(this, 300); // for interval...
    }
}