在下面的代码中,我有3个图像存储在cat lines | grep "xz"
中。我使用处理程序动画图像,但它不断循环,我希望它只运行动画一次。
我想要做的是看它是否到达第3张图片,然后停止动画。
imageArray
答案 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...
}
}