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


148

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

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

私がすでに試したこと:

  • 考えられるすべての組み合わせsetFillBeforesetFillAftersetFillEnabled
  • にを追加LinearInterpolatorAnimationSetます。

1
はい、画像をフェードイン/フェードアウトできます!このチュートリアルでうまくいくはずです。sankarganesh-info-exchange.blogspot.com/2011/04/...
アダム・ストーム

このチュートリアルでは、XMLを使用する方法について説明します。Javaを使用して同じことを達成する方法を知っていますか?
プロウマン、2011

まあ、私は私のプログラミングコンピューターの隣ではないので、このコードをテストすることはできませんが、Javaでxml属性を設定できます。これは元のコードです:android:interpolator = "@ android:anim / accelerate_interpolator" android:fromAlpha = "0.0" android:toAlpha = "1.0" android:duration = "300" /> \ nおそらくMyTween.setDurationg (300)MyTween.fromAlpha(0.0)MyTween(1.0)
アダムストーム

回答:


258

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

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)

1
5または6のフェードイン/フェードアウトを行い、それぞれに100のような非常に小さな遅延がある場合、このようなものを使用できますか?試しましたが、なめらかではありません。目的は、たとえば正しく機能しない電球やきらめきをシミュレートすることでした。
Chayy

this.setAnimationをループで呼び出してみてください
ジョナサン

私は最後のbg imgをフェードアウトし、現在のものをフェードアウトすると思っていましたが、この答えは、現在のbg imgをフェードインし、現在のものをフェードアウトするだけでよいことを示唆しています。AlphaAnimationは2つの異なるimgsをフェードイン/アウトできない。
macio.2014

8
2つの独立したアニメーションを用意する必要はないと思います...単一のアニメーションを作成してパラメーターを設定することもできます。fadeInOut.setRepeatMode(Animation.REVERSE);
RoundSparrow hilltx 2014

次に、繰り返したい場合は、@ jonneyが言ったようにループを呼び出す必要はありません。fadeInOut.setRepeatCount(6)を使用-6を繰り返し回数に変更します。AndroidのネイティブC ++コードに、Javaループを呼び出す代わりに、これらすべてを実行させるオーバーヘッドがはるかに少なくなります。
RoundSparrow hilltx 2014

136

これはすでに回答されていることは知っていますが、....

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

6
+1この答えにより、フェードイン、フェードアウト、フェードインのセキュリティを確保できます(repeatCount = "2"を設定するだけです)。受け入れられた答えが提案するように、私はアニメーションを連結することができませんでした。
ElYeante 2014

1
このalphaリソースを宣言した後、どのように使用できますか?ありがとう
zozelfelfo 2014年

1
zozelfelfoは単なるアニメーションxmlなので、コードにロードしてから、影響を与えたいビューでstartAnimationを呼び出します。
Konrad Winkowski、2014年

@KonradWinkowski startAnimationメソッドには、引数としてAnimationオブジェクトが必要です!私はそれに何を渡すべきですか?
Ahmad Vatani 2015

より完全な答えを探している人のために:viewToAnimate.startAnimation(AnimationUtils.loadAnimation(context, R.anim.fade_in_out)ここでは、resの下のanimフォルダーにfade_in_out.xmlファイルがあります。
クリスナイト

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

4
マシュマロのエレガント!
2016

26

これは、AnimatorSetよりも信頼性が高いように見えるAnimatorSetを使用した私のソリューションです。

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

何らかの理由で、AlphaAnimationを開始するたびに、2回実行されて奇妙なちらつきが発生したため、有効なソリューションを得るには、アニメーションではなくObjectAnimatorを使用する必要がありました。
Andrew Orobator 2015

エレガントなソリューション
Vlad

まあ、その遅すぎるが、私は...これは同じビューに再び使用それを前に、いくつかの、親切に明確なアニメーションの助けかもしれないと思う
Bhavesh Moradiya

21

別の選択肢:

fadeInfadeOutに 2つのアニメーションを定義する必要はありません。フェードアウトはの逆でフェードイン

したがって、次のように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
        }
    });

12

私は(レイアウト用の)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));

@KGCybeX問題ありません。お手伝いできてうれしいです:)
DarkCygnus

1
とても親切で清潔。私にとっては完璧に機能します。
フェルナンドバルボサ

9

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

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

どういうわけか、これは可視性、素敵な設定が含まれます唯一の答えである
ルーク

8

AnimationSetが期待どおりに動作しないようです。結局私はあきらめ、アニメーションをシーケンスするためにHandlerクラスのpostDelayed()を使いました。


8

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

ディレクトリ内のanim *アニメーターではなく
kosas

4

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

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

0

Vitaly Zinchenkosの ソリューションは短かったので、本当に気に入っています。

これは簡単なフェードアウトのためのkotlinのさらに短いバージョンです

viewToAnimate?.alpha = 1f
viewToAnimate?.animate()
             ?.alpha(0f)
             ?.setDuration(1000)
             ?.setInterpolator(DecelerateInterpolator())
             ?.start()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.