导航号,我的单页导航
文章目录

前言

本文主要介绍Android属性动画。这个是之前看《Android进阶之光》记录的,摘抄于此,方便自己查阅。

正文

早期Android提供的动画只有帧动画和 View 动画 ,后面Android 3.0后就出现了属性动画。

在介绍属性动画前,也重新认识一下View动画的优缺点吧,反正谁好用简单就用谁。

下面是View动画的优缺点:

  1. 优点:效率高,使用方便

  2. 缺点:无法进行View交互

而属性动画就完美的解决了View动画的缺点,同时还丰富了动画效果,也更加强大。

下面就进入属性动画的介绍。

ObjectAnimator

    创建一个 ObjectAnimator 只需通过其静态工厂类直接返还一个ObjectAnimator对象。 参数包括一个对象和对象的属性名字, 但这个属性必须有get和set方法, 其内部会通过Java反射机制来调用set方法修改对象的属性值。  
//ofFloat(目标Object,操作属性:x轴移动,操作参数:移动200像素)
ObjectAnimator mObjectAnimator = ObjectAnimator.ofFloat(view, "translationX", 200);
mObjectAnimator.setDuration(300);
mObjectAnimator.start();

除了translationX,还可以以下其他参数:

  1. translationX和translationY: 用来沿着X轴或者Y轴进行平移

  2. rotation、 rotationX、 rotationY: 用来围绕View的支点进行旋转

  3. PrivotX和PrivotY: 控制View对象的支点位置, 围绕这个支点进行旋转和缩放变换处理。 默认该支点 位置就是View对象的中心点。

  4. alpha: 透明度, 默认是1(不透明) , 0代表完全透明

  5. x和y: 描述View对象在其容器中的最终位置

PS: 在使用ObjectAnimator的时候, 要操作的属性必须要有get和set方法, 不然ObjectAnimator 就无法生效。

如果一个属性没有get、 set方法, 也可以通过自定义一个属性类或包装类来间接地给这个属性增加get和set方法。

Android属性动画

ValueAnimator

ValueAnimator不提供任何动画效果, 它更像一个数值发生器, 用来产生有一定规律的数字, 从而让调 用者控制动画的实现过程。

通常情况下, 在ValueAnimator的AnimatorUpdateListener中监听数值的变化, 从而完成动画的变换,

ValueAnimator mValueAnimator =new ValueAnimator.ofFloat(0, 100);
mValueAnimator.setTarget(view);
mValueAnimator.setDuration(1000).start();
mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator){
            Float float = (Float) valueAnimator.getAnimatedValue();
        }
});

动画的监听

完整的动画具有start、 Repeat、 End、 Cancel这4个过程 。但是,我们一般只关心动画的结束。

ObjectAnimator mObjectAnimator =  ObjectAnimator.ofFloat(view, "alpha", 1.5f);
mObjectAnimator.addListener(new ObjectAnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animator){
            super.onAnimationEnd(animator);
            
    }
})

AnimatorSet

顾名思义,应该是一个集合。没错,AnimatorSet可以组合动画一起舞动。AnimatorSet内部采用了建造者模式,也就是可以通过AnimatorSet.Builder组合参数。AnimatorSet.Builder 中包含如下方法:

  1. after(Animator animator ) : 将现有动画插入到传入的动画[animator ]之后执行

  2. after(long delay) : 将现有动画延迟指定毫秒后执行

  3. before(Animator animator ) : 将现有动画插入到传入的动画[animator ]之前执行

  4. with(Animator animator ) : 将现有动画和传入的动画[animator ]同时执行

注意顺序,要不很容易搞晕。

比如after(Animator animator ) 是将现有动画(已经加载的,可以看做after之前添加的动画)添加到animator之后执行。

举个例子

//x轴方向从0移动到200,最后又回到0
ObjectAnimator mObjectAnimator1 = new ObjectAnimator.ofFloat(view,"translationX", 0.0f, 200.0f, 0.0f);
//x轴方向放大到2.0f[放大一倍]
ObjectAnimator mObjectAnimator2 = new ObjectAnimator.ofFloat(view,"scaleX", 1.0f, 2.0f);
//绕着x轴,旋转90°,最后又回来
ObjectAnimator mObjectAnimator3 = new ObjectAnimator.ofFloat(view,"rotationX", 0.0f, 90.0f, 0.0f);

AnimatorSet mAnimatorSet = new AnimatorSet();
mAnimatorSet.setDuration(1000);
mAnimatorSet.play(mObjectAnimator1).with(mObjectAnimator2).after(mObjectAnimator3);
mAnimatorSet.start();

上面介绍过,after之前添加动画的是在after之后执行。

上面执行的顺序:先执行mObjectAnimator3, 后面同时执行mObjectAnimator1和mObjectAnimator2

PropertyValuesHolder

PropertyValuesHolder也可以组合动画,但只能是多个动画一起执行。

Android属性动画

在XML中使用属性动画

属性动画也可以直接写在XML中。 在res文件中新建animator文件, 在里面新建一个scale.xml。

Android属性动画

参考文章

1.《Android进阶之光》

© 版权声明
导航号,我的单页导航

暂无评论

暂无评论...