PropertyValuesHolder : 可以承载多个属性,在一个动画中改变多个属性值
AnimatorSet : 可以承载多个动画,并且自定义动画的执行顺序。
一.PropertyValuesHolder使用:只提供核心代码
PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("scaleX", 0, 1);
PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleY", 0, 1);
PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("alpha", 0, 1);
ObjectAnimator.ofPropertyValuesHolder(view, holder2, holder3).start();
二. AnimatorSet: 只提供核心代码
下面代码设置监听的原因是 因为我不想让每次点击的时候都触发动画,而是想让动画在执行的过程时,无论怎么点击都无法再触发。 因此三个动画都设置了监听。
//将动画2也设置几秒试试很有趣
if(view.getTranslationX() == 200.0){
view.setTranslationX(-200f);
}else if(view.getTranslationX() != -200){
return;
}
ObjectAnimator animator1 = ObjectAnimator.ofFloat(view, "alpha", 0, 1);
animator1.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
view.setTranslationX(-199f);
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
animator1.setDuration(4000);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(view, "translationX", -200, 200);
animator2.setDuration(4000);
animator2.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
matrixStart = view.getMatrix();
rectFStart = new RectF();
matrixStart.mapRect(rectFStart);
Log.d("test", "onAnimationStart: " + view.getLeft() + " " + rectFStart.left + " " + view.getTranslationX() + " " + view.getTop());
}
@Override
public void onAnimationEnd(Animator animation) {
view.setTranslationX(201f);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
ObjectAnimator animator3 = ObjectAnimator.ofFloat(view, "rotation", 0, 1080);
animator3.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
matrixEnd = view.getMatrix();
rectFEnd = new RectF();
matrixEnd.mapRect(rectFEnd);
Log.d("test", "onAnimationEnd: " + view.getLeft() + " " + rectFEnd.left + " " + view.getTranslationX() + " " + view.getTop());
view.setTranslationX(200f);
// view.setTranslationX(-200f);
// Log.d("test", "onAnimationEnd: " + view.getLeft() + " " + rectFEnd.left + " " + view.getTranslationX());
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
animator3.setDuration(4000);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(animator1).before(animator2); // 先执行 1 再执行 2
// animatorSet.play(animator3).after(animator2); //先2后3
animatorSet.playTogether(animator2, animator3); // 2 和 3 同时开始
animatorSet.start();
属性动画是依赖的属性值必须要有对应的set方法,并且set方法里面要有invalidate() 方法才能在属性值改变的时候进行重绘。(必要时还需要有对应get方法)