2017-02-26 57 views
0

我试图编写代码,显示一个ImageView衰落,然后淡出,所以它出现在屏幕上,然后它消失,现在,我没有尝试这个代码如何不取消animate()。alpha(1).setDuration(100)

banana.animate().alpha(1).setDuration(3000); 
banana.animate().alpha(0).setDuration(3000); 

现在你可以看到这两条线都消失了ImageView称为banana应该花费大约3秒,然后在另外三个第二渐变出,合计动画的6秒,但它不这样做,而是第二行取消第一行,使图像永远不会出现。

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

回答

0

当前您正在尝试同时绘制它们。所以你需要一种回调或监听器来告诉你第一个动画已经完成,继续到第二个动画。

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

     } 
    }); 
+0

嘿,谢谢! –

+0

如果你只关心结束状态,你也可以使用['withEndAction()'](https://developer.android.com/reference/android/view/ViewPropertyAnimator.html#withEndAction(java.lang.Runnable))而不是完整的'AnimatorListener'回调。 – ianhanniballake

0

您可以使用withEndAction

banana.animate().alpha(1).setDuration(3000) 
    .withEndAction(new Runnable() { 

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

您可以改为使用自定义TimeInterpolator会自动反转动画,这里有一个我刚刚敲了起来:

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来定义动画或使用AnimatorSet

+0

'.withEndAction()'实际上就是我要找的东西,代码少,能够重复使用我的代码。欢呼 –

+0

Upvote灰色箭头有帮助的答案。 – weston