一、有ViewPropertyAnimator、ObjectAnimator、ValueAnimator,三者递进关系,一个比一个难用。
1.ViewPropertyAnimator:View的函数,采用链式调用可以设置动画的参数,包括各种动画属性和插值器。如
view.animate().setDuration(5000).alpha(0).alphaBy(0).rotation(360)..setInterpolator(new BounceInterpolator())。
2.ObjectAnimator:针对任意对象的动画,简单用法
ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(object, "alpha", 1.0f, 0.3f);
//执行事件
alphaAnim.setDuration(1000);
//延迟
alphaAnim.setStartDelay(300);
alphaAnim.start();
3.ValueAnimator:是属性动画中重要且最基本的核心类,ObjectAnimator 就是通过他来实现的。简单实用方法如下:
ValueAnimator animator = ValueAnimator.ofFloat(0f, 100f);
animator.setDuration(500);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//百分比对应的值
float value = (float) animation.getAnimatedValue();
Log.e("TAG", "onAnimationUpdate: " + value);
v.setScaleX(0.5f + value / 200);
v.setScaleY(0.5f + value / 200);
}
});
animator.start();
二、估值器(TypeEvaluator)
作用:可以理解为计算动画在下一帧时动画的值。
用法:继承TypeEvaluator,复写Evaluate函数,会回传三个参数(float fraction, Object startValue, Object endValue);
1.fraction 动画完成度
2.startValue 动画开始的值
3.endValue动画结束的值
自定义自己的算法,根据动画的开始值以及结束值以及动画完成度,计算出在动画完成到fraction时的Object 的过度值
三、插值器(Interpolator)
作用:可以理解为动画的速度模型。Android有自带的大部分常见的插值器。如
1.AccelerateDecelerateInterpolator :先加速再减速
2.LinearInterpolator:匀速
3.AccelerateInterpolator:持续加速
4.DecelerateInterpolator:持续减速直到0
5.AnticipateInterpolator:先回拉一下再进行正常动画轨迹
6.OvershootInterpolator:动画会超过目标值一些,然后再弹回来
7.AnticipateOvershootInterpolator:开始前回拉,最后超过一些然后回弹
8.BounceInterpolator:在目标值处弹跳
9.CycleInterpolator:一个正弦 / 余弦曲线,可以自定义周期
10.FastOutLinearInInterpolator:匀加速
11.FastOutSlowInInterpolator:先加速再减速。
12.AccelerateDecelerateInterpolator:先加速后减速,较FastOutSlowInInterpolator变化幅度小
13.LinearOutSlowInInterpolator:持续减速
14.PathInterpolator (5.0+):自定义速度曲线
四、自定义插值器(PathInterpolatorCompat)
//定义动画完成度和时间的曲线
Path path = new Path();
path.cubicTo(0.2f, 0f, 0.1f, 1f, 0.5f, 1f);
path.lineTo(1f, 1f);
ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.TRANSLATION_X, 500);
animator.setInterpolator(PathInterpolatorCompat.create(path));
animator.start();
五、多种动画联合使用
1.针对一个View,变化多个属性,使用PropertyValuesHolder 。
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f,0f, 1f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f,0, 1f);
PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f,0, 1f);
ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY,pvhZ).setDuration(1000).start();
2.针对多个View,变化每个View 的单个或者多个属性,使用AnimatorSet。
AnimatorSet的播放动画API:
(1)playSequentially:按顺序播放
(1)playTogether:将所有动画一起播放
ObjectAnimator objectAnimator01 = ObjectAnimator.ofArgb(ivImage01, "BackgroundColor",
getResources().getColor(R.color.colorPrimary),
getResources().getColor(R.color.colorAccent),
getResources().getColor(R.color.colorPrimary));
ObjectAnimator objectAnimator02 = ObjectAnimator.ofFloat(ivImage01, "TranslationY", 0, 300, 0);
ObjectAnimator objectAnimator03 = ObjectAnimator.ofFloat(ivImage02, "TranslationY", 0, 400, 0);
ObjectAnimator objectAnimator04 = ObjectAnimator.ofFloat(ivImage03, "TranslationY", 0, 500, 0);
ObjectAnimator objectAnimator05 = ObjectAnimator.ofFloat(ivImage04, "TranslationY", 0, 600, 0);
AnimatorSet animatorSet=new AnimatorSet();
animatorSet.playSequentially(objectAnimator01,objectAnimator02,objectAnimator03,objectAnimator04,objectAnimator05);
animatorSet.setDuration(2000);
animatorSet.start();