Анимация не начинается до обновления пользовательского интерфейса или события касания
У меня странная проблема с 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
не требуется (одни и те же результаты возникают, если я его не использую), но я предпочитаю хранить его, поскольку я не в потоке пользовательского интерфейса.
Любые идеи о том, что может это сделать?
Ответы
Ответ 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 на другое событие, которое вы можете легко идентифицировать, просто для отладки, если остальная часть кода в порядке или если это просто триггер, который является ответственный за это.