Возобновите анимацию, прежде чем начать другую деятельность - PullRequest
0 голосов
/ 03 января 2019

У меня есть анимация последовательности. Направление анимации - 420 мм. Когда анимация закончена, я пытаюсь начать другое действие с ActivityOptionsCompat (анимация снизу вверх). Вот мой код

private void startSceneAnimation() {
    if (imageView != null) {
        ((AnimationDrawable) imageView.getBackground()).start();
        new Handler().postDelayed(() -> {
            Intent intent = new Intent(LoginTestActivity.this,
                    SPLoginActivity.class);
            ActivityOptionsCompat options = ActivityOptionsCompat.
                    makeSceneTransitionAnimation(LoginTestActivity.this,
                            logo,
                            ViewCompat.getTransitionName(logo));
            startActivity(intent, options.toBundle());
        }, 420);
    }
}

Все работает отлично, но у меня есть один вопрос. Есть ли способ начать новое действие, когда анимация еще не завершена (без остановки анимации). Я пытаюсь начать новое действие через 300 мм, но моя анимация последовательности закончилась

1 Ответ

0 голосов
/ 03 января 2019

AnimationDrawable выполняется в потоке пользовательского интерфейса.Анонимный экземпляр Handler, созданный без параметров, переданных для Looper, также выполняется в потоке пользовательского интерфейса.Следовательно, постановка в очередь действия для изменения на Handler через какое-то время может не произойти, пока не завершится AnimationDrawable, потому что они оба находятся на одном и том же Thread

Попробуйте использовать Timer вместо?

Timer timer = new Timer();
timer.schedule(new TimerTask(){
  public void run() {
    Intent intent = new Intent(LoginTestActivity.this,
                SPLoginActivity.class);
        ActivityOptionsCompat options = ActivityOptionsCompat.
                makeSceneTransitionAnimation(LoginTestActivity.this,
                        logo,
                        ViewCompat.getTransitionName(logo));
        startActivity(intent, options.toBundle());
  }
}, 300);

Timer выполняется в фоновом потоке , и, поскольку он быстро выходит, он не должен вызывать утечек памяти AFAIK.

РЕДАКТИРОВАТЬ: Похоже, что запуск Activity выполняется в внутренне (строка 4614) в платформе Android и может быть вялым, если попытаться выполнить из-за пределов пользовательского интерфейса .Вы можете попытаться опубликовать новое намерение в начале очереди сообщений потока пользовательского интерфейса и посмотреть, работает ли это, но это, вероятно, приведет к остановке анимации в любом случае, поскольку тот же поток пользовательского интерфейса теперь используется для обработки запуска операции.

Timer timer = new Timer();
    timer.schedule(new TimerTask(){
      public void run() {
        new Handler(Looper.getMainLooper()).postAtFrontOfQueue(() -> {
            Intent intent = new Intent(LoginTestActivity.this,
                    SPLoginActivity.class);
            ActivityOptionsCompat options = ActivityOptionsCompat.
                    makeSceneTransitionAnimation(LoginTestActivity.this,
                            logo,
                            ViewCompat.getTransitionName(logo));
            startActivity(intent, options.toBundle());
          });
      }
    }, 300);
...