Как запустить несколько ObjectAnimator на вид одновременно? - PullRequest
1 голос
/ 05 февраля 2020

Здесь я пытаюсь переместить представление на путь с помощью ObjectAnimator, а также необходимо установить еще одну масштабную анимацию для того же представления.

ObjectAnimator objectAnimator = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP)
        {
            objectAnimator = ObjectAnimator.ofFloat(view, View.X, View.Y, path);
        }
        if (objectAnimator != null) {
            objectAnimator.setDuration(2500);
            objectAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
            objectAnimator.start();
view.startAnimation(scaleRection);// this is not working because changing of x y position

необходимо запустить другую анимацию, когда objectAnimator.start ();

также пытался со слушателем

objectAnimator.addListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animation) {
                    view.startAnimation(scaleRection);
                }

                @Override
                public void onAnimationEnd(Animator animation)
                {

                }

                @Override
                public void onAnimationCancel(Animator animation) {

                }

                @Override
                public void onAnimationRepeat(Animator animation) {

                }
            });

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Я бы предложил использовать ViewPropertyAnimator .

Из документов:

Этот класс включает автоматическую c и оптимизированную анимацию выбранных свойств в объектах просмотра. , Если анимируется только одно или два свойства объекта View, тогда использование ObjectAnimator - это нормально; установщики свойств, вызываемые ObjectAnimator, хорошо оснащены для правильной установки свойства и аннулирования представления соответствующим образом. Но если несколько свойств анимируются одновременно или если вы просто хотите, чтобы более удобный синтаксис анимировал указанное свойство c, то ViewPropertyAnimator может лучше подходить для этой задачи.

Этот класс может обеспечить более высокую производительность для нескольких одновременных анимаций, потому что это оптимизирует недействительные вызовы, которые будут выполняться только один раз для нескольких свойств вместо каждого анимированного свойства, независимо вызывая его собственную аннулирование. Кроме того, синтаксис использования этого класса может быть проще в использовании, потому что вызывающей стороне нужно только указать объекту View, какое свойство анимировать, и значение, чтобы анимировать, либо, либо путем, и этот класс обрабатывает детали настройки базового класса Animator и запуская его.

Вы можете объединить столько анимаций, сколько хотите, в одну строку кода:

view.animate().translationX(...).translationY(...).scaleX(...).scaleY(...).setInterpolator(new AccelerateDecelerateInterpolator()).setDuration(2500);

, если вам нужны разные значения длительности или аналогичные, вы это можно сделать двумя строками:

view.animate().translationX().setDuration(...) ...    
view.animate().scaleX().setDuration(...) ...

Существуют также методы translationXBy () и scaleXBy (), которые могут быть более подходящими для вашего случая, и вы также можете установить прослушиватель et c. Проверьте документы для всех доступных методов

0 голосов
/ 05 февраля 2020

Вы также можете использовать AnimatorSet игру вместе https://developer.android.com/reference/android/animation/AnimatorSet.html#playTogether и функцию ее строителя https://developer.android.com/reference/android/animation/AnimatorSet.Builder

Чтобы играть вдвоем ObjectAnimator вместе

например

                AnimatorSet animationSet = new AnimatorSet();

                ObjectAnimator scaleY = ObjectAnimator.ofFloat(view,"scaleY", 1f, 0f);
                scaleY.setDuration(5000);
                scaleY.setInterpolator(new AccelerateDecelerateInterpolator());
                ObjectAnimator scaleX = ObjectAnimator.ofFloat(view,"scaleX", 1f, 0f);
                scaleX.setDuration(5000);
                scaleX.setInterpolator(new AccelerateDecelerateInterpolator());
                animationSet.playTogether(scaleX, scaleY);
                animationSet.start();
...