Анимация Fade In / Out не работает? - PullRequest
0 голосов
/ 28 октября 2018

Я получаю очень странное поведение с Android-анимацией и хочу понять, что происходит.

Мой ImageView невидим в xml, и я не устанавливаю alpha.

Этот код должен был Fade In / Out сделать мой ImageView, но он ничего не оживляет и идет прямо к конечному эффекту:

if (isFadeIn) {
    myImage.animate().alpha(1.0f).setDuration(5000).withStartAction(() -> {
        myImage.setVisibility(View.VISIBLE);
        myImage.setAlpha(0.0f);
    });
} else {
    myImage.animate().alpha(0.0f).setDuration(5000)
      .withEndAction(() -> myImage.setVisibility(View.INVISIBLE));
}

Теперь этот код исчезает и исчезает ...... НО в первый раз, когда он запускается, он не исчезает, а затухание всегда мигает:

if (isFadeIn) {
    myImage.animate().alpha(1.0f).setDuration(5000).withStartAction(() -> {
        myImage.setVisibility(View.VISIBLE);
        myImage.setAlpha(0.0f);
    }).withEndAction(() -> myImage.setAlpha(1.0f));
} else {
    myImage.animate().alpha(0.0f).setDuration(5000)
            .withStartAction(() -> {
                myImage.setAlpha(1.0f);
                myImage.setVisibility(View.VISIBLE);
            })
      .withEndAction(() -> myImage.setVisibility(View.INVISIBLE));
}

Я часами ломаю голову, пытаясь понять, почему возникает такое поведение.

Теперь, этот код работает:

fadeInAnimation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
        myImage.setVisibility(View.VISIBLE);
    }
    @Override public void onAnimationEnd(Animation animation) { }
    @Override public void onAnimationRepeat(Animation animation) { }
});

fadeOutAnimation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) { }
    @Override public void onAnimationEnd(Animation animation) {
        myImage.setVisibility(View.INVISIBLE);
    }
    @Override public void onAnimationRepeat(Animation animation) { }
});

fadeInAnimation.setDuration(5000);
fadeOutAnimation.setDuration(5000);

...

if (isFadeIn) {
    myImage.startAnimation(fadeInAnimation);
} else {                         
    myImage.startAnimation(fadeOutAnimation);
}

Но это слишком многословно, мне это не нравится, но сейчас я придерживаюсь этого, я просто хотел понять, что не так сдругой код.

...