想想之前使用组合动画的时候,是不是这样的:
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(btnShow, "translationX", 0, 300);
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(btnShow, "rotation", 0, 360);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(2000);
animatorSet.play(objectAnimator).with(objectAnimator1);
animatorSet.start();
或者这样的:
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(btnShow, "translationX", 0, 300);
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(btnShow, "rotation", 0, 360);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(2000);
animatorSet.playTogether(objectAnimator,objectAnimator1);
animatorSet.start();
达到的效果是:
初见
然而,还能用下面的方法实现这个效果:
btnShow.animate()
.setDuration(2000)
.translationX(300)
.rotation(360)
.start();
简单了很多有没有 !
概述
平常所做的动画大部分是针对View的,而View经常会需要集中动画混合在一起做,因此提供了一个ViewPropertyAnimator类来快速的实现多个动画的混合。
ViewPropertyAnimator对同时进行多个动画进行了性能优化,虽然有多个动画同时进行,但是一次只刷新一次ui,不会让每个动画都去刷新ui。而且很明显他的写法非常简单。
获取ViewPropertyAnimator
只能通过View.animate()获取ViewPropertyAnimator。
常用方法
这里把能链式调用的全列举出来,感受一下他的方便之处:
btnShow.animate()
.setDuration(5000)
//透明度
.alpha(0)
.alphaBy(0)
//旋转
.rotation(360)
.rotationBy(360)
.rotationX(360)
.rotationXBy(360)
.rotationY(360)
.rotationYBy(360)
//缩放
.scaleX(1)
.scaleXBy(1)
.scaleY(1)
.scaleYBy(1)
//平移
.translationX(100)
.translationXBy(100)
.translationY(100)
.translationYBy(100)
.translationZ(100)
.translationZBy(100)
//更改在屏幕上的坐标
.x(10)
.xBy(10)
.y(10)
.yBy(10)
.z(10)
.zBy(10)
//监听及其他设置
.setInterpolator(new BounceInterpolator())
.setStartDelay(1000)
.setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
})
.setUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
}
})
.withEndAction(new Runnable() {
@Override
public void run() {
Log.i(TAG, "run: end");
}
})
.withStartAction(new Runnable() {
@Override
public void run() {
Log.i(TAG, "run: start");
}
})
.start();
- 动画的方法名和ObjectAnimator中药填写的属性名是一样的,很容易明白。
- 每个动画都有一个By的后缀的方法。加上By的意思是,继续动画这么多数值。不加By的意思是动画到这个数值。
- 也可以设置插值器和Animator.AnimatorListener监听以及ValueAnimator.AnimatorUpdateListener监听
- 可以直接设置动画开始和结束时的回调方法。
- 但是好像没有重复动画的功能
关于By
下面用旋转来演示一下By的区别。
按钮初始旋转角度已经旋转了90, 当点击按钮执行的动画是下面这样的时候,表示旋转到180:
btnShow.animate()
.setDuration(2000)
.rotation(180)
.start();
第一次点击会从90旋转到180,再次点击会从180旋转到180,因为已经是180了,所以看着没动。
如果是By呢?:
btnShow.animate()
.setDuration(2000)
.rotationBy(180)
.start();
作者:qq_25806863 发表于2017/4/18 16:21:36 原文链接
阅读:41 评论:0 查看评论