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

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

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

  1. альфа от 0 до 1 от 1 секунды
  2. удерживайте Альфа на 1 в течение 5 секунд
  3. альфа от 1 до 0 1 секунды
  4. удерживайте Альфа на 0 в течение 5 секунд.
  5. начните снова на 1.

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

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

etc..

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

есть идеи?

спасибо.

2 ответов


Ok имейте в виду эти 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);

для этого есть более простое решение.

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

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

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

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