Цепная анимация со списком просмотров RxJava2 Android - PullRequest
0 голосов
/ 07 июня 2018

все!У меня проблемы с RxJava2, чтобы установить список представлений и анимировать одно за другим (как только каждое представление заканчивает свою анимацию).

Я провел много исследований, и единственное, что близко к этому, это использование RxJava2оператор "andThen()" с классом Completable, который не является тем, что я ищу.

Моя основная идея - иметь:

Observable<List<View>> observable = Observable.fromArray(listOfViews);

и излучать одиночный View для анимации, дождитесь окончания анимации и перейдите к следующей.

Вот пример того, чего я пытаюсь достичь: Пример анимации

Заранее спасибо!

ОБНОВЛЕНИЕ

Это не то решение, которое я ищу, но мне удается сделать одну версию, используя delay, но идея такова:ожидание завершения анимации и затем переход к следующему onNext

Мое решение пока:

List<View> listOfViews = new ArrayList<>();
listOfViews.add(buttonOne);
listOfViews.add(buttonTwo);
listOfViews.add(buttonThree);

Observable
       .fromIterable(listOfViews)
       .concatMap(view -> Observable.just(view)
               .delay(1000, TimeUnit.MILLISECONDS)
               .observeOn(AndroidSchedulers.mainThread())
               .doOnNext(item -> item.animate()
                       .scaleX(2)
                       .scaleY(2)
                       .setDuration(1000)
                       .start()))
       .toList()
       .subscribe();

1 Ответ

0 голосов
/ 07 июня 2018

Если вы хотите, чтобы каждая анимация начиналась после завершения последней, вы правы в том, что решение состоит в использовании Completables, например:

// Assuming you have a source of views to animate
Observable<View> views = Observable.just(button1, button2, button3);

// Create a Completable that completes when the animation ends
public Completable animateView(View view) {
    return Completable
             .create(emitter -> {
                  Animation animation = view.animate();
                  emitter.setCancellable(() -> animation.cancel());
                  animation
                      .scaleX(2f)
                      .scaleY(2f)
                      .setDuration(1000)
                      .withEndAction(() -> emitter.onComplete())
                      .start();
             });
}

// Execute each animation sequentially
views
    .concatMapCompletable(v -> animateView(v))
    .subscribe(...);
...