Je souhaite avoir une animation de 2 secondes d'un ImageView qui passe 1000 ms en fondu en entrée puis 1000 ms en fondu.
Voici ce que j'ai jusqu'à présent dans mon constructeur ImageView:
Animation fadeIn = new AlphaAnimation(0, 1);
fadeIn.setDuration(1000);
Animation fadeOut = new AlphaAnimation(1, 0);
fadeOut.setStartOffset(1000);
fadeOut.setDuration(1000);
AnimationSet animation = new AnimationSet(true);
animation.addAnimation(fadeIn);
animation.addAnimation(fadeOut);
this.setAnimation(animation);
Lorsque je lance cette animation, rien apparaît. Toutefois, lorsque je supprime une des animations alpha, le comportement fonctionne comme prévu.
Choses que j'ai déjà essayées:
setFillBefore
, setFillAfter
et setFillEnabled
.LinearInterpolator
à la AnimationSet
.Compris mon propre problème. La solution a fini par être basée sur des interpolateurs.
Animation fadeIn = new AlphaAnimation(0, 1);
fadeIn.setInterpolator(new DecelerateInterpolator()); //add this
fadeIn.setDuration(1000);
Animation fadeOut = new AlphaAnimation(1, 0);
fadeOut.setInterpolator(new AccelerateInterpolator()); //and this
fadeOut.setStartOffset(1000);
fadeOut.setDuration(1000);
AnimationSet animation = new AnimationSet(false); //change to false
animation.addAnimation(fadeIn);
animation.addAnimation(fadeOut);
this.setAnimation(animation);
val fadeIn = AlphaAnimation(0f, 1f)
fadeIn.interpolator = DecelerateInterpolator() //add this
fadeIn.duration = 1000
val fadeOut = AlphaAnimation(1f, 0f)
fadeOut.interpolator = AccelerateInterpolator() //and this
fadeOut.startOffset = 1000
fadeOut.duration = 1000
val animation = AnimationSet(false) //change to false
animation.addAnimation(fadeIn)
animation.addAnimation(fadeOut)
this.setAnimation(animation)
Je sais que cela a déjà été répondu, mais .....
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fromAlpha="1.0"
Android:toAlpha="0.0"
Android:duration="1000"
Android:repeatCount="infinite"
Android:repeatMode="reverse"
/>
Moyen rapide et facile d'effectuer rapidement un fondu avec une répétition automatique. Prendre plaisir
EDIT: Dans votre activité, ajoutez ceci:
yourView.startAnimation(AnimationUtils.loadAnimation(context, R.anim.yourAnimation));
viewToAnimate.animate().alpha(1).setDuration(1000).setInterpolator(new DecelerateInterpolator()).withEndAction(new Runnable() {
@Override
public void run() {
viewToAnimate.animate().alpha(0).setDuration(1000).setInterpolator(new AccelerateInterpolator()).start();
}
}).start();
Voici ma solution utilisant AnimatorSet qui semble être un peu plus fiable que AnimationSet.
// Custom animation on image
ImageView myView = (ImageView)splashDialog.findViewById(R.id.splashscreenImage);
ObjectAnimator fadeOut = ObjectAnimator.ofFloat(myView, "alpha", 1f, .3f);
fadeOut.setDuration(2000);
ObjectAnimator fadeIn = ObjectAnimator.ofFloat(myView, "alpha", .3f, 1f);
fadeIn.setDuration(2000);
final AnimatorSet mAnimationSet = new AnimatorSet();
mAnimationSet.play(fadeIn).after(fadeOut);
mAnimationSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
mAnimationSet.start();
}
});
mAnimationSet.start();
ne autre alternative:
Pas besoin de définir 2 animations pour fadeIn et fadeOut. fadeOut est l'inverse de fadeIn.
Donc, vous pouvez le faire avec Animation.REVERSE comme ceci:
AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);
alphaAnimation.setDuration(1000);
alphaAnimation.setRepeatCount(1);
alphaAnimation.setRepeatMode(Animation.REVERSE);
view.findViewById(R.id.imageview_logo).startAnimation(alphaAnimation);
then onAnimationEnd:
alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
//TODO: Run when animation start
}
@Override
public void onAnimationEnd(Animation animation) {
//TODO: Run when animation end
}
@Override
public void onAnimationRepeat(Animation animation) {
//TODO: Run when animation repeat
}
});
Voici ce que je faisais en fondu dans Vues, espérons que cela aide quelqu'un.
private void crossFadeAnimation(final View fadeInTarget, final View fadeOutTarget, long duration){
AnimatorSet mAnimationSet = new AnimatorSet();
ObjectAnimator fadeOut = ObjectAnimator.ofFloat(fadeOutTarget, View.ALPHA, 1f, 0f);
fadeOut.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
fadeOutTarget.setVisibility(View.GONE);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
fadeOut.setInterpolator(new LinearInterpolator());
ObjectAnimator fadeIn = ObjectAnimator.ofFloat(fadeInTarget, View.ALPHA, 0f, 1f);
fadeIn.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
fadeInTarget.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animator animation) {}
@Override
public void onAnimationCancel(Animator animation) {}
@Override
public void onAnimationRepeat(Animator animation) {}
});
fadeIn.setInterpolator(new LinearInterpolator());
mAnimationSet.setDuration(duration);
mAnimationSet.playTogether(fadeOut, fadeIn);
mAnimationSet.start();
}
Comme je crois en la puissance de XML (pour les mises en page), c’est l’équivalent pour la réponse acceptée réponse , mais uniquement en tant que ressource d’animation:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:interpolator="@Android:interpolator/accelerate_decelerate"
Android:fillAfter="true">
<alpha
Android:fromAlpha="0"
Android:toAlpha="1"
Android:duration="1000" />
<alpha
Android:fromAlpha="1"
Android:toAlpha="0"
Android:duration="1000"
Android:startOffset="1000"/>
</set>
La fillAfter
permet de conserver le fondu à la fin de l'animation. La interpolator
gère interpolation des animations, comme vous pouvez le deviner. Vous pouvez également utiliser d'autres types d'interpolateurs, tels que Linéaire ou Dépassement.
Assurez-vous de commencer votre animation sur votre vue:
yourView.startAnimation(AnimationUtils.loadAnimation(context, R.anim.fade));
AnimationSets ne semble pas fonctionner comme prévu du tout. À la fin, j'ai abandonné et utilisé postDelayed () de la classe Handler pour séquencer les animations.
Si vous utilisez Animator pour créer une animation, vous pouvez
anim (répertoire) -> fade_out.xml
<?xml version="1.0" encoding="UTF-8"?>
<objectAnimator
Android:propertyName="alpha"
Android:valueFrom="0"
Android:valueTo="1"
xmlns:Android="http://schemas.Android.com/apk/res/Android"/>
En java
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.fade_out);
animator.setTarget(the_view_you_want_to_animation);
animator.setDuration(1000);
animator.start();
Une autre façon de faire disparaître l’animation avec seulement Java code est
ObjectAnimator fadeOut = ObjectAnimator.ofFloat(the_view_you_want_to_animation, "alpha", 1f, 0);
fadeOut.setDuration(2000);
fadeOut.start();
Vous pouvez également utiliser animationListener, à peu près comme ceci:
fadeIn.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationEnd(Animation animation) {
this.startAnimation(fadeout);
}
});