Подтвердить что ты не робот

Android-альфа-анимация fadein fadeout с задержками

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

Идея состоит в том, чтобы выполнить эту анимацию над представлением:

  • alpha от 0 до 1 из 1 секунды
  • удерживать альфа на 1 в течение 5 секунд
  • alpha от 1 до 0 из 1 секунды
  • удерживайте альфа на 0 в течение 5 секунд.
  • начать снова на 1.

Я попытался реализовать это с помощью AnimationSet как:

AnimationSet animationSet = new AnimationSet(true);

Animation animation1 = new AnimationUtils.loadAnimation(this, android.R.anim.fade_in);
animation1.setDuration(1000);

Animation animation2 = new AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
animation2.setDuration(1000);
animation2.setStartOffset(5000);

Animation animation3 = new AlphaAnimation(0.0f, 0.0f);
animation3.setDuration(4000)
animation3.setStartOffset(6000);

animationSet.add(animation1);
animationSet.add(animation2);
animationSet.add(animation3);

и т.д..

но похоже, что третья анимация делает беспорядок со всеми альфа-анимациями, я полагаю, что это вызывает внутреннюю непоследовательность в том, как Android управляет этим типом анимации.

Любая идея?

Спасибо.

4b9b3361

Ответ 1

Ok Имейте в виду эти 2 балла, чтобы решить эту проблему.


  • Если я хочу оживить 1.0f to 0.0f через 5 секунд с длительностью анимации 1 секунда, это, в конечном счете, 1-секундная анимация с паузой в 5 секунд.

    Чтобы добиться этого:

    • setDuration(1000) (длительность 1 секунда)
    • setStartOffset(5000) (он начнется через 5 секунд)

  • Вам нужно всего две анимации, которые будут циклически навсегда.

    1. 0.0f to 1.0f с паузой в 5 секунд и длительностью 1 секунду

    2. 1.0f to 0.0f с паузой в 5 секунд и длительностью 1 секунду


И вот код:

    animation1 = new AlphaAnimation(0.0f, 1.0f);
    animation1.setDuration(1000);
    animation1.setStartOffset(5000);

    animation2 = new AlphaAnimation(1.0f, 0.0f);
    animation2.setDuration(1000);
    animation2.setStartOffset(5000);

    textView.startAnimation(animation1);

Однако для цикла навсегда я буду использовать AnimationListener, потому что repeatCount не работает:

    animation1 = new AlphaAnimation(0.0f, 1.0f);
    animation1.setDuration(1000);
    animation1.setStartOffset(5000);

    //animation1 AnimationListener
    animation1.setAnimationListener(new AnimationListener(){

        @Override
        public void onAnimationEnd(Animation arg0) {
            // start animation2 when animation1 ends (continue)
            textView.startAnimation(animation2);
        }

        @Override
        public void onAnimationRepeat(Animation arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationStart(Animation arg0) {
            // TODO Auto-generated method stub

        }

    });

    animation2 = new AlphaAnimation(1.0f, 0.0f);
    animation2.setDuration(1000);
    animation2.setStartOffset(5000);

    //animation2 AnimationListener
    animation2.setAnimationListener(new AnimationListener(){

        @Override
        public void onAnimationEnd(Animation arg0) {
            // start animation1 when animation2 ends (repeat)
            textView.startAnimation(animation1);
        }

        @Override
        public void onAnimationRepeat(Animation arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationStart(Animation arg0) {
            // TODO Auto-generated method stub

        }

    });

    textView.startAnimation(animation1);

Ответ 2

Это более простое решение.

Предположим, что ваше представление находится в состоянии GONE. Чтобы оживить его видимость:

yourView.setVisibility(View.VISIBLE);
yourView.animate().alpha(1).setDuration(300);

Таким же образом вы можете добавить слушателей анимации.

Это также работает для анимации масштаба и трансляции.