Остановка набора аниматоров при последовательном воспроизведении

#java #android-studio #android-animation #objectanimator #animatorset

#java #android-studio #android-анимация #objectanimator #набор аниматоров

Вопрос:

У меня есть некоторый код, который создает список точек, называемых path .

Вот примерный список: [[1, 3], [2, 3], [2, 4]]

Вот код, который я написал, чтобы анимировать движение к этим точкам последовательно:

         ArrayList<Animator> movements = new ArrayList<>();
        int prevY = start[1];
        int prevX = start[0];
        for (int[] square : path) {

            ObjectAnimator motion = new ObjectAnimator();

            float[] coord = screenFromGrid(square[0], square[1], gridSizeY);
            long speed = (long) (6000.0 / this.displayMetrics.widthPixels);
            speed = (long) (speed * getSquareSize(gridSizeY));

            if (square[0] != prevX) {

                motion = ObjectAnimator.ofFloat(this.sprite1, "x", coord[0]);
                motion.setInterpolator(new LinearInterpolator());
                motion.setDuration(speed);
                movements.add(motion);
                prevX = square[0];
            } else if (square[1] != prevY) {

                motion = ObjectAnimator.ofFloat(this.sprite1, "y", coord[1]);
                motion.setInterpolator(new LinearInterpolator());
                motion.setDuration(speed);
                movements.add(motion);
                prevY = square[1];
            }
        }
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.playSequentially(movements);
        animatorSet.start();
  

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

Я проверил отладчик, и он говорит, что все анимации были сохранены правильно.

Кто-нибудь знает, почему это происходит?

Ответ №1:

Все, что я знаю по опыту, это то, что AnimatorSet глючит и не всегда работает так, как ожидалось, у меня также были с этим проблемы, и, к счастью, я нашел другой, лучший подход: ViewPropertyAnimator — хороший способ анимировать представления с помощью короткого и сжатого кода. Вы могли бы написать свой собственный метод, который вы можете изменять и повторно использовать по своему усмотрению, что-то вроде :

 private void customAnimation(View view, float toX, float toY, int duration, boolean loop) {
    view.animate()
        .translationX(toX)
        .translationY(toY)
        .setDuration(duration)
        .setInterpolator(new LinearInterpolator())
        .setListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                if(loop) {
                    customAnimation(..., false);
                }
            }
        });
  

Слушатель ожидает завершения первой анимации, чтобы вы могли вызвать следующую анимацию там. Для последовательного воспроизведения без бесконечного цикла я добавил логическое значение к параметрам, которое выполняет следующую анимацию только в случае true.

Это также сократило бы остальную часть вашего кода до примерно такого :

 int prevY = start[1];
int prevX = start[0];
for (int[] square : path) {
    float[] coord = screenFromGrid(square[0], square[1], gridSizeY);
    long speed = (long) (6000.0 / this.displayMetrics.widthPixels);
    speed = (long) (speed * getSquareSize(gridSizeY));

    if (square[0] != prevX) {
        customAnimation(this.sprite1, coord[0], 0, speed, true);
        prevX = square[0];
    } else if (square[1] != prevY) {
        customAnimation(this.sprite1, 0, coord[1], speed, true);
        prevY = square[1];
    }
}
  

Обязательно проверьте документы на наличие всех доступных методов, возможно.translationXBy(float byX) больше подходит в вашем случае, чем .translationX(float toX)

Комментарии:

1.Большое вам спасибо! У меня один вопрос: вы сказали дважды вызвать customAnimation. Вы имели в виду это? customAnimation(...) customAnimation(...) Если да, то у меня это не сработало, и я попытался написать рекурсивную функцию, используя withEndAction, но это тоже не сработало. Как мне играть последовательно?

2. если я неправильно истолковал слово последовательно, я обновил свой ответ

3. Спасибо 🙂 У меня последний вопрос: здесь вы говорите «следующая анимация», но как мне выполнить это динамически без рекурсии?

4. вы можете добавить логическое значение к параметрам, которые, если true, вызывают customAnimation, если не останавливаются…

5. я имею в виду, как я могу динамически воспроизводить анимации одну за другой. Потому что мне кажется, что я должен жестко кодировать каждую последовательную анимацию.