Android-альфа-анимация исчезает с задержками - PullRequest
36 голосов
/ 21 июля 2010

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

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

  1. альфа от 0 до1 из 1 секунды
  2. удерживать альфа на 1 в течение 5 секунд
  3. альфа от 1 до 0 в течение 1 секунды
  4. удерживать альфа на 0 в течение 5 секунд.
  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 управляет этим типом анимации.

Есть идеи?

Спасибо.

Ответы [ 2 ]

106 голосов
/ 15 августа 2011

Хорошо. Запомните эти 2 пункта, чтобы решить эту проблему:


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

    Для этого:

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

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

    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);
17 голосов
/ 30 августа 2016

Существует более простое решение для этого.

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

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

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

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

...