Fade In Fade Out Android анимация на Java
Я хочу иметь 2-секундную анимацию ImageView, которая тратит 1000 мс затухания, а затем 1000 мс затухания.
вот что у меня есть до сих пор в моем конструкторе 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);
когда я запускаю эту анимацию, ничего показывает вверх. Однако, когда я удаляю одну из Альфа-анимаций, поведение работает так, как ожидалось.
вещи, которые я уже пробовал:
- все мыслимые комбинации
setFillBefore
,setFillAfter
, иsetFillEnabled
. - добавлять
LinearInterpolator
доAnimationSet
.
10 ответов:
выяснил свою собственную проблему. Решение оказалось основано на интерполяторах.
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);
Я знаю, что на это уже был дан ответ, но.....
<?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" />
быстрый и простой способ быстро сделать исчезают и с повторением себя. Наслаждайтесь
EDIT : В вашей деятельности добавить это:
yourView.startAnimation(AnimationUtils.loadAnimation(context, R.anim.yourAnimation));
вот мое решение с использованием AnimatorSet, который кажется немного более надежным, чем 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();
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();
другой вариант:
нет необходимости определять 2 анимации для fadeIn и затухание. затухание обратно в fadeIn.
Так что вы можете сделать это с помощью анимация.Обратный такой:
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);
затем 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 } });
анимационные наборы, похоже, не работают так, как ожидалось. В конце концов я сдался и использовал класс обработчика postDelayed() для последовательной анимации.
вот что я использовал, чтобы исчезать в / из просмотров, надеюсь, что это поможет кому-то.
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(); }
Если вы используете аниматор для создания анимации вы можете
аним (каталог) -> 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"/>
в java
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.fade_out); animator.setTarget(the_view_you_want_to_animation); animator.setDuration(1000); animator.start();
другой способ сделать анимацию исчезают только с кодом java является
ObjectAnimator fadeOut = ObjectAnimator.ofFloat(the_view_you_want_to_animation, "alpha", 1f, 0); fadeOut.setDuration(2000); fadeOut.start();
вы также можете использовать animationListener, что-то вроде этого:
fadeIn.setAnimationListener(new AnimationListener() { @Override public void onAnimationEnd(Animation animation) { this.startAnimation(fadeout); } });
поскольку я верю в силу XML (для макетов), это эквивалентно принятому ответ, но чисто как анимационный ресурс:
<?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>
The
fillAfter
для исчезают после завершения анимации. Элементinterpolator
ручки интерполяция анимации, как вы можете догадаться. Вы также можете использовать другие типы интерполяторов, такие как линейный или перерегулирование.обязательно запустите анимацию на вашем вид:
yourView.startAnimation(AnimationUtils.loadAnimation(context, R.anim.fade));