Fade In Fade Out Java'da Android Animasyonu


148

1000 ms solmaya ve sonra 1000 ms solmaya harcayan bir ImageView 2 saniyelik bir animasyon istiyorum.

Benim ImageView yapıcı şimdiye kadar sahip İşte:

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

Bu animasyonu çalıştırdığımda hiçbir şey görünmüyor. Ancak, alfa animasyonlarından birini kaldırdığımda, davranış beklendiği gibi çalışır.

Daha önce denediğim şeyler:

  • Her akla kombinasyonu setFillBefore, setFillAfterve setFillEnabled.
  • Bir ekleme LinearInterpolatoriçin AnimationSet.

1
Evet, görüntüleri içeri ve dışarı soldurabilirsiniz! Bu öğretici hile yapmalıdır. sankarganesh-info-exchange.blogspot.com/2011/04/…
Adam Storm

Bu öğreticide XML kullanan bir yöntem açıklanmaktadır. Java kullanarak aynı şeyi nasıl başaracağınızı biliyor musunuz?
ploughman

Eh, ben bu kodu test edemiyorum, ancak benim programlama bilgisayar yanında değilim, ama java xml öznitelikleri ayarlayabilirsiniz. bu orijinal kod: android: interpolator = "@ android: anim / accelerate_interpolator" android: fromAlpha = "0.0" android: toAlpha = "1.0" android: süresi = "300" /> \ n böylece muhtemelen MyTween.setDurationg yapabilirsiniz (300) MyTween.fromAlpha (0.0) MyTween (1.0)
Adam Storm

Yanıtlar:


258

Kendi sorunumu çözdüm. Çözüm, arabuluculara dayandırıldı.

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 kullanıyorsanız

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
Her biri için 100 gibi küçük gecikmelerle 5 veya 6 solma giriş / çıkış yapmak isterseniz, böyle bir şey kullanabilir misiniz? Denedim ama gerçekten akıcı değil. Amaç, örneğin düzgün çalışmayan bir ampulü simüle etmek ve parıldamaktı.
Chayy

Bir döngüde animasyon
Jonathan

Mevcut bg'de son bg img ve solmayı söndüğümü düşünüyordum, ama bu cevap bana sadece mevcut bg img'de solmaya ve mevcut olanı silmeye ihtiyacım olduğu konusunda ilham veriyor, çünkü AlphaAnimation iki farklı imde solmaz / çıkamaz .
macio.Jun

8
İki bağımsız animasyona sahip olmanız gerektiğini düşünmüyorum ... Tek bir animasyona sahip olabileceğinizi ve parametreyi ayarlayabileceğinizi düşünüyorum: fadeInOut.setRepeatMode (Animation.REVERSE);
RoundSparrow hilltx

İkincisi: tekrarlamak isterseniz, @jonney'nin söylediği gibi bir döngüde çağrı yapmaya gerek yok. fadeInOut.setRepeatCount (6) kullanın - 6'yı tekrarlamasını istediğiniz şekilde değiştirin. Android'de yerel C ++ kodunun Java döngüsünde çağırmak yerine tüm bunları yapmasına izin vermek için çok daha az yük.
RoundSparrow hilltx

137

Bunun zaten cevaplandığını biliyorum ama .....

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

Hızlı ve kolay bir şekilde kendi kendini tekrarlayarak solmaya ve hızla solmaya. Zevk almak

EDIT : Etkinliğinize şunu ekleyin:

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

6
+1 Çünkü bu cevapla solmaya, solmaya ve solmaya bir güvence verebilirim (sadece repeatCount = "2" ayarlanıyor). Kabul edilen yanıtın önerdiği gibi animasyonları birleştiremedim.
ElYeante

1
Bu alphakaynağı bildirdikten sonra nasıl kullanabilirim? Thanks
zozelfelfo

1
zozelfelfo sadece bir animasyon xml koduna yükleyin ve etkilemek istediğiniz görünümde startAnimation'ı çağırın.
Konrad Winkowski

@KonradWinkowski startAnimation yöntemi, Animasyon nesnesini bağımsız değişken olarak gerektirir! ona ne geçmeliyim?
Ahmad Vatani

Daha eksiksiz bir yanıt arayanlar için: viewToAnimate.startAnimation(AnimationUtils.loadAnimation(context, R.anim.fade_in_out)res altındaki anim klasöründe fade_in_out.xml dosyası var.
Chris Knight

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
Marshmallow için Elegante!
17'de LET'ler

26

AnimasyonSet'ten biraz daha güvenilir gibi görünen AnimatorSet'i kullanarak benim çözümüm.

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

Çalışan bir çözüm elde etmek için bir Animasyon yerine bir ObjectAnimator kullanmak zorunda kaldım çünkü bir nedenden dolayı, bir AlphaAnimation başlattığımda, iki kez koştu ve garip bir titreme yaptı.
Andrew Orobator

zarif çözüm
Vlad

Peki, çok geç ama ben yine aynı görünümde kullanmadan önce bazı, nazik net animasyon yardımcı olabilir düşünüyorum ..
Bhavesh Moradiya

21

Başka bir alternatif:

FadeIn ve fadeOut için 2 animasyon tanımlamanıza gerek yoktur . fadeOut tersidir fadeIn .

Böylece bunu Animation.REVERSE ile yapabilirsiniz :

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

Sonra 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'nin (mizanpajlar) gücüne inandığım gibi, bu kabul edilen cevap için eşdeğerdir , ancak tamamen bir animasyon kaynağı olarak:

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

fillAfterSolma animasyon tamamladıktan sonra kalması içindir. interpolatorkolları enterpolasyon tahmin edebileceğiniz gibi, animasyonlar. Linear veya Overshoot gibi başka enterpolatörler de kullanabilirsiniz.

Animasyonunuzu görünümünüzde başlattığınızdan emin olun:

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

@KGCybeX sorun değil, sevindim sevindim :)
DarkCygnus

1
Çok yararlı ve temiz. Benim için mükemmel çalışıyor.
Fernando Barbosa

9

İşte içeri / dışarı solmaya ne kullandım, umarım bu birine yardımcı olur.

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

Her nasılsa, görünürlük ayarını içeren tek cevap bu, güzel
Luke

8

AnimationSets beklendiği gibi çalışmıyor. Sonunda vazgeçtim ve animasyonları sıralamak için Handler sınıfının postDelayed () yöntemini kullandım.


8

Animasyon yapmak için Animator kullanıyorsanız

anim (dizin) -> 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'da

Animator animator = AnimatorInflater.loadAnimator(context, R.animator.fade_out);
animator.setTarget(the_view_you_want_to_animation);
animator.setDuration(1000);
animator.start();

Animasyonun sadece java kodu ile solmasını sağlamanın diğer yolu

ObjectAnimator fadeOut = ObjectAnimator.ofFloat(the_view_you_want_to_animation, "alpha",  1f, 0);
fadeOut.setDuration(2000);
fadeOut.start();

dizinde anim * animatör değil
kosas

4

Ayrıca, animationListener'ı şu şekilde kullanabilirsiniz:

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

0

Kısa olduğu için Vitaly Zinchenkos çözümünü gerçekten çok seviyorum .

İşte basit bir solukluk için kotlin'de daha kısa bir versiyon

viewToAnimate?.alpha = 1f
viewToAnimate?.animate()
             ?.alpha(0f)
             ?.setDuration(1000)
             ?.setInterpolator(DecelerateInterpolator())
             ?.start()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.