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

Анимация не начинается до обновления пользовательского интерфейса или события касания

У меня странная проблема с AlphaAnimation. Он должен работать многократно, когда вызывается обработчик AsyncTask.

Однако при первом вызове обработчика в Activity анимация не запускается, если я не коснусь экрана или если пользовательский интерфейс обновлен (например, нажав кнопку меню телефона).

Странная часть заключается в том, что, как только анимация запускается хотя бы один раз, она начнет без проблем, если обработчик снова будет вызван.

Вот что выглядит код:

// AsyncTask handler
public void onNetworkEvent()
{
  this.runOnUiThread(new Runnable() {
    @Override
    public void run()
    {
      flashScreen(Animation.INFINITE);
    }
  });
}

// Called method
private void flashScreen(int repeatCount)
{
  final View flashView = this.findViewById(R.id.mainMenuFlashView);

  AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
  alphaAnimation.setRepeatCount(repeatCount);
  alphaAnimation.setRepeatMode(Animation.RESTART);
  alphaAnimation.setDuration(300);
  alphaAnimation.setInterpolator(new DecelerateInterpolator());
  alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation)
    {
      flashView.setVisibility(View.VISIBLE);
    }

    @Override
    public void onAnimationEnd(Animation animation)
    {
      flashView.setVisibility(View.GONE);
    }

    @Override
    public void onAnimationRepeat(Animation animation) { }
  });

  flashView.startAnimation(alphaAnimation);
}

Я заметил, что runOnUIThread не требуется (одни и те же результаты возникают, если я его не использую), но я предпочитаю хранить его, поскольку я не в потоке пользовательского интерфейса.

Любые идеи о том, что может это сделать?

4b9b3361

Ответ 1

Немного больше исследований показало, что моя проблема была одна и та же: Анимация макета не работает при первом запуске

По умолчанию значение flashView было установлено на GONE (в результате чего Animation не запускался немедленно, поскольку View никогда не отображался), поэтому мне просто нужно установить его на INVISIBLE перед вызовом flashView.startAnimation()

Ответ 2

Если настройка View на VISIBLE не будет работать, как это было в моем случае, это помогло мне вызвать requestLayout() перед запуском Animation, например:

Animation an = new Animation() {
...   
view.requestLayout();
view.startAnimation(an);

В моем случае мой View был 0dip высоким, что предотвращало вызов onAnimationStart, это помогло мне в решении этой проблемы.

Ответ 3

Это сработало для меня:

view.setVisibility(View.VISIBLE);
view.startAnimation(animation);

Мне пришлось установить view на VISIBLE (не INVISIBLE, ни GONE), что вызвало необходимость визуализации визуализации для его анимации.

Ответ 4

Это нелегко. До того, как вы получите реальный ответ: начало анимации запускается onNetworkEvent. Поскольку мы не знаем остальную часть кода, вы должны посмотреть там, попробуйте изменить onNetworkEvent на другое событие, которое вы можете легко идентифицировать, просто для отладки, если остальная часть кода в порядке или если это просто триггер, который является ответственный за это.