为什么连续的动画相互交织?
Why Consecutive Animations Intertwine Each Other?
我想为反射测试应用创建动画。
我称之为目标,是用户可以在 500 毫秒内单击以获得分数的按钮。
我希望我的目标淡入 (250ms) 并在 (250ms) 之后淡出。
但是当我执行下面的代码时,所有目标(按钮)在一段时间后开始淡入淡出。
我假设代码无法正确地使目标不可见。
如有任何帮助,我们将不胜感激。
动画初始化:
animationFadeIn = AnimationUtils.loadAnimation(this, R.anim.fade_in_250ms);
animationFadeOut = AnimationUtils.loadAnimation(this, R.anim.fade_out_250ms);
方法:(tempeRand是为了不选择最后一个目标。)
private void hideTargs() {
Random rand = new Random();
int randTarget = rand.nextInt(12);
Animation.AnimationListener animListener = new Animation.AnimationListener(){
int randTargetIn = randTarget;
@Override
public void onAnimationStart(Animation animation) {
if (animation == animationFadeIn){
buttonArray[randTargetIn].setVisibility(View.VISIBLE);
}
}
@Override
public void onAnimationRepeat(Animation animation) { }
@Override
public void onAnimationEnd(Animation animation) {
if (animation == animationFadeIn) {
buttonArray[randTargetIn].startAnimation(animationFadeOut);
} else if (animation == animationFadeOut) {
buttonArray[randTargetIn].setVisibility(View.INVISIBLE);
int temperRand = 0;
boolean isDifferentRandom = false;
while (!isDifferentRandom){
temperRand = rand.nextInt(12);
if (temperRand != randTargetIn)
isDifferentRandom = true;
}
randTargetIn = temperRand;
buttonArray[temperRand].startAnimation(animationFadeIn);
}
}
};
// Set listener to animation
animationFadeIn.setAnimationListener(animListener);
animationFadeOut.setAnimationListener(animListener);
// Start fade-in animation
buttonArray[randTarget].startAnimation(animationFadeIn);
}
fade_in_250ms.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true" >
<alpha
android:duration="250"
android:fromAlpha="0.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="1.0" />
</set>
fade_out_250ms.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true" >
<alpha
android:duration="250"
android:fromAlpha="1.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="0.0" />
</set>
一次应该是一个可见的目标。但结果是 this.
如果有人想使用这种方法,这里是问题的答案:
多个视图上的这种闪烁和不需要的动画:
发生这种情况是因为我们从未停止或清除最后一个视图的动画。现在我添加了 .setAnimation(null) 来清除动画。
更新代码:
private void hideTargs(){
Random rand = new Random();
int randTarget = rand.nextInt(12);
Animation.AnimationListener animListener = new Animation.AnimationListener(){
int randTargetIn = randTarget;
@Override
public void onAnimationStart(Animation animation) {
if (animation == animationFadeIn){
buttonArray[randTargetIn].setVisibility(View.VISIBLE);
}
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
if (animation == animationFadeIn) {
buttonArray[randTargetIn].setAnimation(null);
buttonArray[randTargetIn].startAnimation(animationFadeOut);
} else if (animation == animationFadeOut) {
buttonArray[randTargetIn].setAnimation(null);
buttonArray[randTargetIn].setVisibility(View.INVISIBLE);
int temperRand = 0;
boolean isDifferentRandom = false;
while (!isDifferentRandom){
temperRand = rand.nextInt(12);
if (temperRand != randTargetIn)
isDifferentRandom = true;
}
randTargetIn = temperRand;
buttonArray[randTargetIn].startAnimation(animationFadeIn);
}
}
};
// Set listener to animation
animationFadeIn.setAnimationListener(animListener);
animationFadeOut.setAnimationListener(animListener);
// Start fade-in animation
buttonArray[randTarget].startAnimation(animationFadeIn);
}
我想为反射测试应用创建动画。 我称之为目标,是用户可以在 500 毫秒内单击以获得分数的按钮。 我希望我的目标淡入 (250ms) 并在 (250ms) 之后淡出。 但是当我执行下面的代码时,所有目标(按钮)在一段时间后开始淡入淡出。 我假设代码无法正确地使目标不可见。
如有任何帮助,我们将不胜感激。
动画初始化:
animationFadeIn = AnimationUtils.loadAnimation(this, R.anim.fade_in_250ms);
animationFadeOut = AnimationUtils.loadAnimation(this, R.anim.fade_out_250ms);
方法:(tempeRand是为了不选择最后一个目标。)
private void hideTargs() {
Random rand = new Random();
int randTarget = rand.nextInt(12);
Animation.AnimationListener animListener = new Animation.AnimationListener(){
int randTargetIn = randTarget;
@Override
public void onAnimationStart(Animation animation) {
if (animation == animationFadeIn){
buttonArray[randTargetIn].setVisibility(View.VISIBLE);
}
}
@Override
public void onAnimationRepeat(Animation animation) { }
@Override
public void onAnimationEnd(Animation animation) {
if (animation == animationFadeIn) {
buttonArray[randTargetIn].startAnimation(animationFadeOut);
} else if (animation == animationFadeOut) {
buttonArray[randTargetIn].setVisibility(View.INVISIBLE);
int temperRand = 0;
boolean isDifferentRandom = false;
while (!isDifferentRandom){
temperRand = rand.nextInt(12);
if (temperRand != randTargetIn)
isDifferentRandom = true;
}
randTargetIn = temperRand;
buttonArray[temperRand].startAnimation(animationFadeIn);
}
}
};
// Set listener to animation
animationFadeIn.setAnimationListener(animListener);
animationFadeOut.setAnimationListener(animListener);
// Start fade-in animation
buttonArray[randTarget].startAnimation(animationFadeIn);
}
fade_in_250ms.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true" >
<alpha
android:duration="250"
android:fromAlpha="0.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="1.0" />
</set>
fade_out_250ms.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true" >
<alpha
android:duration="250"
android:fromAlpha="1.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="0.0" />
</set>
一次应该是一个可见的目标。但结果是 this.
如果有人想使用这种方法,这里是问题的答案:
多个视图上的这种闪烁和不需要的动画:
发生这种情况是因为我们从未停止或清除最后一个视图的动画。现在我添加了 .setAnimation(null) 来清除动画。
更新代码:
private void hideTargs(){
Random rand = new Random();
int randTarget = rand.nextInt(12);
Animation.AnimationListener animListener = new Animation.AnimationListener(){
int randTargetIn = randTarget;
@Override
public void onAnimationStart(Animation animation) {
if (animation == animationFadeIn){
buttonArray[randTargetIn].setVisibility(View.VISIBLE);
}
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
if (animation == animationFadeIn) {
buttonArray[randTargetIn].setAnimation(null);
buttonArray[randTargetIn].startAnimation(animationFadeOut);
} else if (animation == animationFadeOut) {
buttonArray[randTargetIn].setAnimation(null);
buttonArray[randTargetIn].setVisibility(View.INVISIBLE);
int temperRand = 0;
boolean isDifferentRandom = false;
while (!isDifferentRandom){
temperRand = rand.nextInt(12);
if (temperRand != randTargetIn)
isDifferentRandom = true;
}
randTargetIn = temperRand;
buttonArray[randTargetIn].startAnimation(animationFadeIn);
}
}
};
// Set listener to animation
animationFadeIn.setAnimationListener(animListener);
animationFadeOut.setAnimationListener(animListener);
// Start fade-in animation
buttonArray[randTarget].startAnimation(animationFadeIn);
}