属性动画是Android 3.0加入的,为了弥补View动画的不足,但是Android 3.0以下虽然可以使用动画兼容库但是其本质依旧是View动画
View动画的不足之处
动画效果单一,旋转,平移,缩放
影像动画,并没有改变本身的参数,需要交互式view的时候暴露缺陷
作用对象局促于View上
ValueAnimator 类
先改变值,然后 手动赋值 给对象的属性从而实现动画;是 间接 对对象属性进行操作;
ValueAnimator 对值进行操作
ValueAnimator.ofInt(int values)
ValueAnimator.ofFloat(float values)
ValueAnimator.ofObject(int values) 需要自定义估值器
ObjectAnimator 类
先改变值,然后 自动赋值 给对象的属性从而实现动画;是 直接对对象属性进行操作;
ObjectAnimator 继承自ValueAnimator类,即底层的动画实现机制是基于ValueAnimator类
ObjectAnimator 类针对的是任意对象 & 任意属性值,并不是单单针对于View对象
如果需要采用ObjectAnimator 类实现动画效果,那么需要操作的对象就必须有该属性的set() & get()
同理,针对上述另外的三种基本动画效果,View 也存在着setRotation()、getRotation()、setTranslationX()、getTranslationX()、setScaleY()、getScaleY()等set() & get() 。
AnimatorSet 类 可组合动画 实现方式有 XML设置 / Java代码设置
AnimatorSet.play(Animator anim) :播放当前动画
AnimatorSet.after(long delay) :将现有动画延迟x毫秒后执行
AnimatorSet.with(Animator anim) :将现有动画和传入的动画同时执行
AnimatorSet.after(Animator anim) :将现有动画插入到传入的动画之后执行
AnimatorSet.before(Animator anim) : 将现有动画插入到传入的动画之前执行
Java代码实现
// 步骤1:设置需要组合的动画效果
ObjectAnimator translation = ObjectAnimator.ofFloat(mButton, "translationX", curTranslationX, 300,curTranslationX); // 平移动画
ObjectAnimator rotate = ObjectAnimator.ofFloat(mButton, "rotation", 0f, 360f); // 旋转动画
ObjectAnimator alpha = ObjectAnimator.ofFloat(mButton, "alpha", 1f, 0f, 1f); // 透明度动画
// 步骤2:创建组合动画的对象
AnimatorSet animSet = new AnimatorSet();
// 步骤3:根据需求组合动画
animSet.play(translation).with(rotate).before(alpha);
animSet.setDuration(5000);
// 步骤4:启动动画
animSet.start();
xml实现
在value的目录下创建animator 资源文件夹 ,在此文件夹中创建xml文件
ordering是动画播放方式 :together和sequentially 代表同时和顺序执行俩个方式
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="sequentially">
<set android:ordering="together">
<objectAnimator android:propertyName="translationX" android:valueFrom="0dp" android:valueTo="300dp" android:duration="3000" android:valueType="floatType"/>
<objectAnimator android:propertyName="rotation" android:valueFrom="0" android:valueTo="360" android:duration="2000" android:valueType="floatType"/>
</set>
<set android:ordering="sequentially">
<objectAnimator android:propertyName="alpha" android:valueFrom="1" android:valueTo="0" android:duration="500" android:valueType="floatType"/>
<objectAnimator android:propertyName="alpha" android:valueFrom="0" android:valueTo="1" android:duration="500" android:valueType="floatType"/>
</set>
</set>