자바로 페이드 인 안드로이드 애니메이션 페이드 아웃


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

해당 애니메이션을 실행할 때 아무 것도 나타나지 않습니다 . 그러나 알파 애니메이션 중 하나를 제거하면 동작이 예상대로 작동합니다.

내가 이미 시도한 것 :

  • 생각할 수있는 모든 조합 setFillBefore, setFillAftersetFillEnabled.
  • 에를 추가 LinearInterpolator합니다 AnimationSet.

1
예, 이미지를 페이드 인 및 페이드 아웃 할 수 있습니다! 이 튜토리얼은 트릭을 수행해야합니다. sankarganesh-info-exchange.blogspot.com/2011/04/…
Adam Storm

이 튜토리얼에서는 XML을 사용하는 방법에 대해 설명합니다. Java를 사용하여 동일한 것을 달성하는 방법을 알고 있습니까?
plowman

글쎄, 나는 내 프로그래밍 컴퓨터 옆에 있지 않으므로이 코드를 테스트 할 수는 없지만 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)
Adam Storm

답변:


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
각각 100과 같은 작은 지연으로 5 또는 6 페이딩 인 / 아웃을하려면 어떻게해야합니까? 시도했지만 실제로 유동적이지는 않습니다. 목표는 예를 들어 제대로 작동하지 않는 전구를 시뮬레이션하고 반짝 거리는 것입니다.
Chayy

반복해서 this.setAnimation을 호출하십시오.
Jonathan

나는 마지막 bg img를 페이드 아웃하고 현재의 페이드를 페이드 아웃한다고 생각하고 있지만,이 답변은 현재 bg img에서 페이드 아웃하고 현재의 페이드 아웃을 페이드 아웃하면된다. .
macio.6

8
두 개의 독립적 인 애니메이션이 필요하다고 생각하지 않습니다. 단일 애니메이션을 가질 수 있고 매개 변수를 설정할 수 있다고 생각합니다. fadeInOut.setRepeatMode (Animation.REVERSE);
RoundSparrow hilltx 2014 년

둘째 : 반복하고 싶다면 @jonney와 같은 루프를 호출 할 필요가 없습니다. fadeInOut.setRepeatCount (6) 사용-반복 횟수를 6으로 변경하십시오. Android의 네이티브 C ++ 코드가 Java 루프를 호출하는 대신이 모든 작업을 수행 할 수 있도록 오버 헤드가 훨씬 적습니다.
RoundSparrow hilltx 2014 년

137

나는 이것이 이미 답변되었지만 .....

<?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이 답변으로 페이드 인, 페이드 아웃 및 페이드 인 보안을 만들 수 있기 때문에 (반복 횟수 = 2로 설정). 허용 된 답변이 제안한대로 애니메이션을 연결할 수 없습니다.
ElYeante

1
alpha리소스를 선언 한 후 어떻게 사용할 수 있습니까? 감사합니다
zozelfelfo

1
zozelfelfo는 애니메이션 XML 일 뿐이므로 코드에로드 한 다음 영향을 미치는 모든보기에서 startAnimation을 호출하십시오.
Konrad Winkowski

@KonradWinkowski startAnimation 메소드에는 애니메이션 객체가 인수로 필요합니다! 무엇을 전달해야합니까?
Ahmad Vatani

더 완전한 답변을 찾고있는 사람들을 위해 : viewToAnimate.startAnimation(AnimationUtils.loadAnimation(context, R.anim.fade_in_out)res 아래의 anim 폴더에 fade_in_out.xml 파일이 있습니다.
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
마시멜로를위한 우아함!
LET가

26

다음은 AnimateatorSet을 사용하는 솔루션으로 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();

AlphaAnimation을 시작할 때마다 두 번 실행되어 이상한 깜박임이 있었기 때문에 작동하는 솔루션을 얻으려면 Animation 대신 ObjectAnimator를 사용해야했습니다.
앤드류 Orobator

우아한 솔루션
Vlad

글쎄, 너무 늦었지만 이것이 같은 견해에서 다시 사용하기 전에 친절하고 명확한 애니메이션을 도울 수 있다고 생각합니다.
Bhavesh Moradiya

21

다른 대안 :

fadeInfadeOut에 대해 2 개의 애니메이션을 정의 할 필요가 없습니다 . fadeOutfadeIn과 반대입니다 .

따라서 Animation 으로이 작업을 수행 할 수 있습니다 .

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

어쨌든 이것은 가시성 설정을 포함하는 유일한 대답입니다.
Luke

8

애니메이션 세트가 예상대로 작동하지 않는 것 같습니다. 결국 Handler 클래스의 postDelayed ()를 포기하고 애니메이션을 시퀀싱했습니다.


8

애니메이션 제작에 Animator를 사용하면

애님 (디렉토리)-> 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"/>

자바에서

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

자바 코드만으로 애니메이션을 페이드 아웃하는 다른 방법은

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.