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