2016-05-01 5 views
0

У меня есть Activity с панелью инструментов (которая является частью анимации SharedElements Activity), и ниже этой панели инструментов расположены три ImageViews горизонтально рядом друг с другом. В своей реализации XML все три устанавливаются INVISIBLE.ImageViews мерцает, прежде чем они должны быть видны

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

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

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

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

Here's a gif of the srtange behaviour.


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

Для всех трех ImageViews:

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

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

+0

Спасибо, это работает, и я обновил свой вступительный пост. Но ваше предложение GONE не было оптимальным, потому что гравитация GridView, в которой объекты ImageViews сосредоточены по горизонтали, так что значки сбрасывались с середины только для перемещения их положения всякий раз, когда следующее изображение становилось видимым. Невидимый - лучший выбор за Gone. – Eyntschl

+0

Рад, что я мог помочь, у меня не осталось много нового, но я рад, что мое предложение помогло. – Ali