属性动画在Android3.0之后推出的,通过修改控件的属性,从而实现的动画效果。属性动画是真正改变了控件的属性。
包括ValueAnimator和ObjectAnimation;
动画类的命名不同:View Animation中动画类取名都叫XXXXAnimation,而在Property Animator中动画类的取名则叫XXXXAnimator,
ObjectAnimator是派生自ValueAnimator的,所以ValueAnimator中所能使用的方法,在ObjectAnimator中都可以正常使用。
知识储备:
使用到的属性解释如下:
duration:动画时长,毫秒为单位;
透明度:1为完成不透明,0为完全透明;
repeatCount:重复次数,默认为 0 就是不重复,1 则代表再重复一次,注意是再重复一次,也就是总共执行了两次,ValueAnimator.INFINITE代表无限循环;
repeatMode:重复模式,有两个值可选:RESTART 当一个动画到达结尾时,如果需要重复播放,那么就初始位置状态开始播放。REVERSE 当一个动画到达结尾时,如果需要重复播放,那么就从结束状体开始逆向播放;
android:fillAfter如果设置为true,控件动画结束时,将保持动画最后时的状态;
android:fillBefore如果设置为true,控件动画结束时,还原到开始动画前的状态;
android:fillEnabled与android:fillBefore 效果相同,都是在动画结束时,将控件还原到初始化状态;
android:interpolator设定插值器,其实就是指定的动作效果,比如弹跳效果等。
1、透明度渐变动画,alpha
android:fromAlpha动画开始的透明度,从0.0 --1.0 ,0.0表示全透明,1.0表示完全不透明
android:toAlpha动画结束时的透明度,也是从0.0 --1.0 ,0.0表示全透明,1.0表示完全不透明
代码实现:
// 参数1:要修改的目标控件
// 参数2:属性名称,目标控件的属性名称
// 参数3:属性的值,可变参数,可以设置多个值
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "alpha", 0, 1, 0.5f, 1);
// 设置动画的时长
objectAnimator.setDuration(3000);
// 设置动画的重复次数
objectAnimator.setRepeatCount(2);
// 设置动画的重复模式
objectAnimator.setRepeatMode(ValueAnimator.REVERSE);
// 启动动画
objectAnimator.start();
2、平移动画,translationX、translationY
android:fromXDelta起始点X轴坐标,可以是数值、百分数、百分数p 三种样式;
android:fromYDelta起始点Y轴从标,可以是数值、百分数、百分数p 三种样式;
android:toXDelta结束点X轴坐标
android:toYDelta结束点Y轴坐标
//设置x方向平移
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "translationX", 0, 200);
objectAnimator.setDuration(2000);
objectAnimator.start();
3、缩放动画,scaleX、scaleY
缩放scale:
android:fromXScale起始的X方向上相对自身的缩放比例,浮点值,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍;
android:toXScale结尾的X方向上相对自身的缩放比例,浮点值;
android:fromYScale起始的Y方向上相对自身的缩放比例,浮点值,
android:toYScale结尾的Y方向上相对自身的缩放比例,浮点值;
android:pivotX缩放起点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p,当为数值时,表示在当前View的左上角,即原点处加上50px,做为起始缩放点;如果是50%,表示在当前控件的左上角加上自己宽度的50%做为起始点;如果是50%p,那么就是表示在当前的左上角加上父控件宽度的50%做为起始点x轴坐标。
android:pivotY缩放起点Y轴坐标,取值及意义跟android:pivotX一样。
参数中:pivotXType,它的取值有三个,Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF和Animation.RELATIVE_TO_PARENT
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "scaleX", 1, 2);
objectAnimator.setDuration(2000);
objectAnimator.start();
4、旋转动画,rotation、rotationX、rotationY
android:fromDegrees开始旋转的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数
android:toDegrees结束时旋转到的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数
android:pivotX起点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p
android:pivotY起点Y轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p
旋转有 3 种,rotation:绕着控件中心点顺时针旋转;rotationX:绕着控件的X轴旋转;rotationY:绕着控件的Y轴旋转。
旋转的角度是以角度值为单位的,范围介于[0,360]。
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "rotation", 0, 360);
objectAnimator.setDuration(2000);
//设置重复次数
objectAnimator.setRepeatCount(ValueAnimator.INFINITE);
//设置重复模式
objectAnimator.setRepeatMode(ValueAnimator.RESTART);
objectAnimator.start();
5、动画集合
//创建一个属性动画集合
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator rotationAnimator = ObjectAnimator.ofFloat(iv, "rotation", 0, 360);
rotationAnimator.setDuration(2000);
//设置重复次数
rotationAnimator.setRepeatCount(ValueAnimator.INFINITE);
//设置重复模式
rotationAnimator.setRepeatMode(ValueAnimator.RESTART);
ObjectAnimator scaleAnimator = ObjectAnimator.ofFloat(iv, "scaleX", 1, 2);
scaleAnimator.setDuration(2000);
scaleAnimator.setRepeatCount(ValueAnimator.INFINITE);
//一个一个动画一次执行
//animatorSet.playSequentially(rotationAnimator,scaleAnimator);
//同时执行所有动画
animatorSet.playTogether(rotationAnimator,scaleAnimator);
animatorSet.start();
6、xml实现属性动画
在res目录下创建animator文件夹,然后创建一个objectAnimator资源文件。
代码中:
// 参数2:属性动画的资源文件id
Animator animator = AnimatorInflater.loadAnimator(this, R.animator.property_anim);
// 设置目标控件
animator.setTarget(iv);
// 启动动画
animator.start();
GitHub上代码地址