在 Java 中淡入淡出 Android 动画

我想有一个2秒动画的一个图像视图,花费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);

当我运行这个动画时,没什么就会出现。但是,当我删除其中一个 alpha 动画时,行为会按预期工作。

我已经试过的方法:

  • setFillBeforesetFillAftersetFillEnabled的所有可能组合。
  • LinearInterpolator添加到 AnimationSet
248872 次浏览

我发现了自己的问题,解决方案最终以插值器为基础。

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)

我知道这个问题已经有答案了,但是..。

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

快速简单的方法来快速做一个淡入淡出与自我重复。享受

编辑: 在你的活动中添加以下内容:

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

AnimationSet 似乎根本不能像预期的那样工作。最后,我放弃了使用 Handler 类的 postDelayed ()对动画进行排序。

您还可以使用 animationListener,如下所示:

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

下面是我使用 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();

这里是我用来淡入/淡出视图,希望这对某些人有所帮助。

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

另一种选择:

不需要为 褪色淡出定义2个动画。 淡出褪色的反面。

所以你可以这样处理 动画,反转:

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

然后是 动画结束:

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

如果你使用动画制作你可以

Anim (目录)-> < strong > hide _ 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"/>

在爪哇

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

正如我相信 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>

fillAfter是为了在完成动画后仍然淡出。interpolator处理动画的 插值,你可以猜到。您还可以使用其他类型的插值器,如线性插值或超调插值。

一定要在视图中启动动画:

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

我真的很喜欢 Vitaly Zinchenkos 解决方案,因为它很短。

这里是一个更简短的版本在科特林为一个简单的淡出

viewToAnimate?.alpha = 1f
viewToAnimate?.animate()
?.alpha(0f)
?.setDuration(1000)
?.setInterpolator(DecelerateInterpolator())
?.start()