为什么连续的动画相互交织?

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);

}