这里我正尝试使用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。
来自文档:
此类可以自动优化选择的动画View对象的属性。如果一个视图上只有一个或两个属性对象被动画,然后使用ObjectAnimator就可以了;的由ObjectAnimator调用的属性设置器非常适合执行设置属性并适当地使视图无效的正确做法。但是,如果同时对多个属性进行动画处理,或者想要一种更方便的语法为特定属性设置动画,然后ViewPropertyAnimator可能更适合该任务。
该课程可能为多个同时提供更好的性能动画,因为它将优化无效调用的发生多个属性仅一次,而不是每个动画属性独立导致自身无效。另外,使用的语法该类可能更易于使用,因为调用者只需告诉要为其设置动画的View对象,以及要设置动画的值到达或到达,并且此类处理配置Animator基础类并启动它。
您可以在一行代码中一次链接任意数量的动画:
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及其生成器功能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();