Làm mờ dần Hoạt hình Android mờ dần trong Java


148

Tôi muốn có một hình ảnh động 2 giây của ImageView dành 1000ms mờ dần và sau đó 1000ms mờ dần.

Đây là những gì tôi có cho đến nay trong trình xây dựng ImageView của tôi:

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

Khi tôi chạy hình ảnh động đó, không có gì hiển thị. Tuy nhiên, khi tôi loại bỏ một trong các hình động alpha, hành vi hoạt động như mong đợi.

Những điều tôi đã thử:

  • Mỗi sự kết hợp có thể tưởng tượng của setFillBefore, setFillAftersetFillEnabled.
  • Thêm một LinearInterpolatorvào AnimationSet.

1
Có bạn có thể làm mờ hình ảnh trong và ngoài! Hướng dẫn này nên thực hiện các mẹo. sankarganesh-info-exchange.blogspot.com/2011/04/ Kẻ
Adam Storm

Hướng dẫn đó mô tả một phương pháp sử dụng XML. Bạn có biết làm thế nào để đạt được điều tương tự khi sử dụng Java không?
cày

Chà, tôi không ở cạnh máy tính lập trình của mình nên tôi không thể kiểm tra mã này, nhưng bạn có thể đặt thuộc tính xml trong java. đây là mã gốc: android: interpolator = "@ android: anim / Accelerate_interpolator" android: fromAlpha = "0.0" android: toAlpha = "1.0" android: terms = "300" /> \ n nên bạn có thể MyTween.setDurationg (300) MyTween.fromAlpha (0.0) MyTween (1.0)
Adam Storm

Câu trả lời:


258

Tìm ra vấn đề của riêng tôi. Các giải pháp cuối cùng đã được dựa trên nội suy.

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


Nếu bạn đang sử dụng 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
Điều gì sẽ xảy ra nếu bạn muốn thực hiện 5 hoặc 6 fading vào / ra, với độ trễ thực sự nhỏ như 100 cho mỗi cái, bạn có thể sử dụng cái gì đó như thế này không? Tôi đã thử nhưng nó không thực sự trôi chảy. Mục đích là để mô phỏng ví dụ như một bóng đèn không hoạt động chính xác và lấp lánh.
Chayy

hãy thử và gọi this.setAnimation in a loop
Jonathan

Tôi đã nghĩ rằng tôi đã làm mờ dần bg img và mốt cuối cùng trong cái hiện tại, nhưng câu trả lời này truyền cảm hứng cho tôi rằng tôi chỉ cần làm mờ dần trong bg img hiện tại và làm mờ dần cái hiện tại, vì AlphaAnimation không thể làm mờ / tắt hai hình ảnh khác nhau .
macio.Jun

8
Tôi không nghĩ rằng bạn cần phải có hai hình ảnh động độc lập ... Tôi nghĩ rằng bạn có thể có một hình ảnh động duy nhất và đặt tham số: fadeInOut.setRepeatMode (Animation.REVERSE);
RoundSparrow hilltx

Thứ hai: nếu bạn muốn lặp lại, không cần phải gọi trong một vòng lặp như @jonney đã nói. sử dụng fadeInOut.setRepeatCount (6) - thay đổi 6 thành số lượng bạn muốn nó lặp lại. Ít chi phí hơn nhiều để cho phép mã C ++ bản địa trong Android thực hiện tất cả điều này thay vì gọi trong một vòng lặp Java.
RoundSparrow hilltx

136

Tôi biết rằng điều này đã được trả lời nhưng .....

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

Cách nhanh chóng và dễ dàng để nhanh chóng làm mờ dần trong và tự lặp lại. Thưởng thức

EDIT : Trong hoạt động của bạn thêm điều này:

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

6
+1 Bởi vì với câu trả lời này, tôi có thể tạo ra một khoảng mờ dần, mờ dần và mờ dần (chỉ cần đặt repeatCount = "2"). Tôi không thể ghép hình ảnh động như câu trả lời được chấp nhận đề xuất.
ElYeante

1
Sau khi khai báo alphatài nguyên này, làm thế nào tôi có thể sử dụng nó?. Cảm ơn
zozelfelfo 17/03/2016

1
zozelfelfo nó chỉ là một xml hoạt hình, vì vậy hãy tải nó vào mã và sau đó gọi startAnimation trên bất kỳ chế độ xem nào bạn muốn nó ảnh hưởng.
Konrad Winkowski

@KonradWinkowski Phương thức startAnimation yêu cầu đối tượng Animation làm đối số! những gì tôi nên vượt qua nó?
Ahmad Vatani 24/07/2015

Đối với những người đang tìm kiếm một câu trả lời đầy đủ hơn : viewToAnimate.startAnimation(AnimationUtils.loadAnimation(context, R.anim.fade_in_out), nơi có tệp fade_inOC.xml trong thư mục hoạt hình dưới độ phân giải.
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
Elegante cho Marshmallow!
LET

26

Đây là giải pháp của tôi khi sử dụng Animatorset có vẻ đáng tin cậy hơn một chút so với 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();

Tôi đã phải sử dụng ObjectAnimator thay vì Animation để có được giải pháp hoạt động vì một số lý do, bất cứ khi nào tôi bắt đầu AlphaAnimation, nó chạy hai lần và nhấp nháy kỳ lạ.
Andrew Orobator

giải pháp tao nhã
Vlad

Chà, đã quá muộn nhưng tôi nghĩ điều này có thể giúp ích cho một số người, vui lòng xóa hoạt hình trước khi sử dụng lại trên cùng một góc nhìn ..
Bhavesh Moradiya

21

Một cách khác:

Không cần xác định 2 hình động cho fadeInfadeOut . fadeOut là đảo ngược của fadeIn .

Vì vậy, bạn có thể làm điều này với Animation.REVERSE như thế này:

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

sau đó 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

Vì tôi tin vào sức mạnh của XML (đối với bố cục), đây là tương đương với câu trả lời được chấp nhận , nhưng hoàn toàn là tài nguyên hoạt hình:

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

Việc fillAfterlàm mờ dần vẫn còn sau khi hoàn thành hoạt hình. Việc interpolatorxử lý nội suy của các hình ảnh động, như bạn có thể đoán. Bạn cũng có thể sử dụng các loại nội suy khác, như Tuyến tính hoặc Quá mức.

Hãy chắc chắn để bắt đầu hoạt hình của bạn trên quan điểm của bạn:

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

@KGCybeX không có vấn đề gì, rất vui vì tôi có thể giúp đỡ :)
DarkCygnus

1
Rất hữu ích và sạch sẽ. Hoạt động hoàn hảo cho tôi.
Fernando Barbosa

9

Đây là những gì tôi đã sử dụng để làm mờ dần Lượt xem vào / ra, hy vọng điều này sẽ giúp được ai đó.

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

Bằng cách nào đó đây là câu trả lời duy nhất bao gồm thiết lập khả năng hiển thị, tốt đẹp
Luke

8

AnimationSets dường như không hoạt động như mong đợi. Cuối cùng, tôi đã từ bỏ và sử dụng postDelayed () của lớp Handler để tạo hiệu ứng hoạt hình.


8

Nếu bạn sử dụng Animator để tạo hoạt hình, bạn có thể

hình động (thư mục) -> fadeDef.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"/>

Trong java

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

Một cách khác để làm cho hình ảnh động mờ dần chỉ với mã java là

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

trong thư mục hoạt hình * không phải hoạt hình
kosas

4

Bạn cũng có thể sử dụng animationListener, một cái gì đó như thế này:

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

0

Tôi thực sự thích giải pháp Vitaly Zinchenkos vì nó ngắn.

Đây là một phiên bản thậm chí còn nhanh hơn trong kotlin cho một sự mờ dần đơn giản

viewToAnimate?.alpha = 1f
viewToAnimate?.animate()
             ?.alpha(0f)
             ?.setDuration(1000)
             ?.setInterpolator(DecelerateInterpolator())
             ?.start()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.