web-dev-qa-db-ja.com

フェードインフェードアウトAndroidアニメーションJava

1000msのフェードインと1000msのフェードアウトを費やすImageViewの2秒のアニメーションが必要です。

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

そのアニメーションを実行すると、nothingが表示されます。ただし、アルファアニメーションの1つを削除すると、動作は期待どおりに機能します。

私がすでに試したこと:

  • setFillBeforesetFillAfter、およびsetFillEnabledの考えられるすべての組み合わせ。
  • LinearInterpolatorAnimationSetを追加します。
135
plowman

私自身の問題を見つけました。ソリューションは最終的に補間器に基づいています。

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


Kotlinを使用している場合

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)
233
plowman

これはすでに回答済みですが、.....

<?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(co‌​ntext, R.anim.yourAnimation));
123

これは、AnimatorSetを使用した私のソリューションです。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();
24
TWilly
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();
24

別の選択肢:

fadeInおよびfadeOutに対して2つのアニメーションを定義する必要はありません。 fadeOutfadeInの逆です。

したがって、次のようにAnimation.REVERSEでこれを行うことができます。

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

これが私がビューをフェードイン/フェードアウトするために使用したものです。これが誰かの助けになることを願っています。

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

AnimationSetsが期待どおりに機能しないようです。最後に私はあきらめて、HandlerクラスのpostDelayed()を使用してアニメーションをシーケンスしました。

8
Richard

Animatorを使用してアニメーションを作成すると、次のことができます。

anim(ディレクトリ)-> 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();
7
Phan Van Linh

XML(レイアウト用)の力を信じているように、これは受け入れられた answer に相当しますが、純粋にアニメーションリソースとして:

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

次のようなanimationListenerを使用することもできます。

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