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


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, setFillAfter및 setFillEnabled.
  • 에를 추가 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

다른 대안 :

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

따라서 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.