Android:属性动画

属性动画是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>
上一篇:android-如何在没有调用Listener.onAnimationEnd的情况下停止ValueAnimator


下一篇:深入理解Android之动画