Java 如何不取消animate().alpha(1).setDuration(100)

Java 如何不取消animate().alpha(1).setDuration(100),java,android,imageview,android-imageview,Java,Android,Imageview,Android Imageview,我试图编写代码,显示一个ImageView淡入淡出,然后淡出,所以它出现在屏幕上,然后消失,现在,我尝试了这个代码 banana.animate().alpha(1).setDuration(3000); banana.animate().alpha(0).setDuration(3000); 现在您可以看到,这两行正在淡出一个名为banana的ImageView,它应该需要大约3秒钟,然后在另外3秒钟淡出,总共产生6秒钟的动画,但它没有这样做,而是第二行取消了第一行,使图像永远不会出现 是否

我试图编写代码,显示一个
ImageView
淡入淡出,然后淡出,所以它出现在屏幕上,然后消失,现在,我尝试了这个代码

banana.animate().alpha(1).setDuration(3000);
banana.animate().alpha(0).setDuration(3000);
现在您可以看到,这两行正在淡出一个名为
banana
ImageView
,它应该需要大约3秒钟,然后在另外3秒钟淡出,总共产生6秒钟的动画,但它没有这样做,而是第二行取消了第一行,使图像永远不会出现


是否有可能使其出现和消失而没有任何问题?

目前您正在尝试同时绘制它们。因此,您需要一种回调或侦听器来告诉您第一个动画已经完成,然后继续第二个动画

banana.animate().alpha(1).setDuration(3000).setListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {

        }

        @Override
        public void onAnimationEnd(Animator animation) {
            banana.animate().alpha(0).setDuration(3000);
        }

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    });
您可以使用:

您可以改为使用一个将自动反转动画的自定义,下面是我刚刚制作的一个:

import android.animation.TimeInterpolator;
import android.view.animation.LinearInterpolator;

/**
 * Maps time into another interpolator so that the animation plays, and then reverses.
 * i.e. time maps like so:
 * [0..0.5, 0.5..1] maps to [0..1, 1..0]
 */
public final class AutoReverseInterpolator implements TimeInterpolator {

    private final TimeInterpolator inner;

    /**
     * Decorator constructor, use if you don't want a linear interpolation.
     * @param inner
     */
    public AutoReverseInterpolator(TimeInterpolator inner) {
        this.inner = inner;
    }

    /**
     * Linear interpolation constructor.
     */
    public AutoReverseInterpolator() {
        this(new LinearInterpolator());
    }

    @Override
    public float getInterpolation(float input) {
        input *= 2;
        if (input > 1) {
            input = 2 - input;
        }
        return inner.getInterpolation(input);
    }
}
用法:

banana.animate().alpha(1).setDuration(6000)
      .setInterpolator(new AutoReverseInterpolatorDecorator());
或者对于更复杂的动画链,您应该考虑使用xml来定义动画或使用。

如果您只关心结束状态,而不是完整的
AnimatorListener
回调,也可以使用。
.withEndAction()
实际上就是我想要的,代码更少,并且可以重复使用我的代码。干杯
banana.animate().alpha(1).setDuration(6000)
      .setInterpolator(new AutoReverseInterpolatorDecorator());