WedX - журнал о программировании и компьютерных науках

ImageViews мерцают, прежде чем они должны быть видны

У меня есть действие с панелью инструментов (которая является частью анимации входа в действие SharedElements), а под этой панелью инструментов расположены три изображения ImageView, расположенные горизонтально рядом друг с другом. В их реализации XML все три установлены НЕВИДИМЫМИ.

То, что я пытаюсь сделать, это анимировать их последовательно, «отбрасывая» из-за панели инструментов. Моя реализация такова:

 int delay = 500;
    for (int y = 0; y < 3; y++) {

        ObjectAnimator oa = ObjectAnimator.ofFloat(imageViews[y],
                "translationY", -300, 0);
        oa.setDuration(600);
        oa.setStartDelay(delay);
        oa.start();
        imageViews[y].setVisibility(View.VISIBLE);
        delay = delay+100;
    }
}

Как вы можете видеть, я перебираю три ImageView и запускаю анимацию для каждого из них, чтобы перейти от -300 X-позиции (которая находится за панелью инструментов) к их нормальному положению. Эта анимация отлично работает - именно так, как я хочу, но проблема в том, что прямо перед тем, как все ImageViews кратковременно мерцают, что я не могу объяснить. Я пытался отладить, но пока я просматриваю строки этой части, мой экран остается черным. Поэтому я не могу определить, где/почему Views становятся видимыми.

Может быть, вы можете помочь мне найти мою ошибку.

Вот картинка странного поведения.


Спасибо, это мой рабочий код:

Для всех трех изображений ImageView:

ObjectAnimator anim1Pin = ObjectAnimator.ofFloat(img_pinned, "translationY", -300, 0);
    anim1Pin.setDuration(ANIMATON_DURATION);
    anim1Pin.setStartDelay(300);
    anim1Pin.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {
            img_pinned.setVisibility(View.VISIBLE);
        }

        @Override
        public void onAnimationEnd(Animator animation) {

        }

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    });

И AnimatorSet:

AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.playTogether(anim1Pin, anim2Alarm, anim3LED);
    animatorSet.start();

Ответы:


1

Немного вещей, во-первых, проблема может быть такой же простой, как установка состояния видимости на GONE, а затем, после запуска анимации, установка его на видимость. Однако я бы также использовал AnimatorSet для одновременного воспроизведения анимаций и добавления задержать, а не делать это в цикле. Если вы используете AnimatorSet, в AnimationListener есть метод onAnimationStart, который вы можно использовать набор visible равным VISIBLE, а не делать так, как вы должны гарантировать, что они станут видимыми в нужное время.

01.05.2016
  • Спасибо, это работает, и я обновил свой вступительный пост. Но ваше предложение GONE не было оптимальным, потому что гравитация GridView, в которой находятся ImageViews, центрирована по горизонтали, поэтому значки выпадали из середины только для изменения своего положения всякий раз, когда следующее изображение становилось видимым. Invisible — лучший выбор, чем Gone 01.05.2016
  • Рад, что смог помочь, не так уж и много осталось от исходного поста, но я рад, что мое предложение помогло. 02.05.2016
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]