如何在视图中同时启动多个 ObjectAnimator?

How to start multiple ObjectAnimator on view simultaneously?

我在这里尝试使用 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) {

                }
            });

我建议使用 ViewPropertyAnimator

来自文档:

This class enables automatic and optimized animation of select properties on View objects. If only one or two properties on a View object are being animated, then using an ObjectAnimator is fine; the property setters called by ObjectAnimator are well equipped to do the right thing to set the property and invalidate the view appropriately. But if several properties are animated simultaneously, or if you just want a more convenient syntax to animate a specific property, then ViewPropertyAnimator might be more well-suited to the task.

This class may provide better performance for several simultaneous animations, because it will optimize invalidate calls to take place only once for several properties instead of each animated property independently causing its own invalidation. Also, the syntax of using this class could be easier to use because the caller need only tell the View object which property to animate, and the value to animate either to or by, and this class handles the details of configuring the underlying Animator class and starting it.

您可以在一行代码中一次链接任意数量的动画:

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

如果您需要不同的持续时间值或类似值,您可以用两行来完成:

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

还有一些方法 translationXBy() 和 scaleXBy() 可能更适合你的情况,你也可以设置一个监听器等。检查docs所有可用的方法

也可以用一个AnimatorSet一起玩https://developer.android.com/reference/android/animation/AnimatorSet.html#playTogether and it's builder function 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();