studio android animation

studio - Fade In Fade Out Animación de Android en Java



android animation fade in fade out (10)

Quiero tener una animación de 2 segundos de un ImageView que gasta 1000ms de desvanecimiento y luego 1000ms de desvanecimiento.

Esto es lo que tengo hasta ahora en mi constructor de 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);

Cuando ejecuto esa animación, no aparece nada . Sin embargo, cuando elimino una de las animaciones alfa, el comportamiento funciona como se esperaba.

Cosas que ya he probado:

  • Cada combinación concebible de setFillBefore , setFillAfter y setFillEnabled .
  • Agregar LinearInterpolator al AnimationSet .

Aquí está mi solución usando AnimatorSet que parece ser un poco más confiable 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();


Como creo en el poder de XML (para diseños), este es el equivalente de la answer aceptada, pero puramente como un recurso de animación:

<?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>

El fillAfter es para que el fundido permanezca después de completar la animación. El interpolator maneja la interpolation de las animaciones, como puede adivinar. También puede usar otros tipos de interpoladores, como Linear o Overshoot.

Asegúrese de comenzar su animación en su vista:

yourView.startAnimation(AnimationUtils.loadAnimation(co‌​ntext, R.anim.fade));


Descubrí mi propio problema. La solución terminó siendo basada en interpoladores.

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


Esto es lo que usé para desvanecerme en las vistas, espero que esto ayude a alguien.

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


Los AnimationSets no parecen funcionar del modo esperado. Al final, me di por vencido y utilicé el postDelayed () de la clase Handler () para secuenciar animaciones.


Sé que esto ya ha sido respondido pero .....

<?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" />

Manera rápida y fácil de hacer un fundido de entrada y salida con una repetición automática. Disfrutar

EDITAR : en tu actividad agrega esto:

yourView.startAnimation(AnimationUtils.loadAnimation(co‌​ntext, R.anim.yourAnimation));


Si usa Animator para hacer animación, puede

animator (directorio) -> 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();

Otra forma de hacer que la animación se desvanezca con solo el código de java es

ObjectAnimator fadeOut = ObjectAnimator.ofFloat(the_view_you_want_to_animation, "alpha", 1f, 0); fadeOut.setDuration(2000); fadeOut.start();


También puede usar animationListener, algo como esto:

fadeIn.setAnimationListener(new AnimationListener() { @Override public void onAnimationEnd(Animation animation) { this.startAnimation(fadeout); } });


Otra alternativa:

No es necesario definir 2 animaciones para fadeIn y fadeOut . fadeOut está en reversa de fadeIn .

Entonces puedes hacer esto con Animation.REVERSE así:

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

luego, en Fin de la Animación :

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


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