Android 的属性动画的实现和使用详解

Android 的属性动画的实现和使用详解

在app里面添加炫酷的动画效果,出来的效果是件非常棒的,所以,接下来我要介绍的就是Android的动画之一属性动画(Property Animation),为什么说是之一呢?因为还有补间动画和帧动画,不过我不会介绍的(感兴趣的可以百度去),因为,,因为有属性动画就够了,完全可以实现所有的效果。

属性动画的基本api :

  • Duration动画的持续时间,默认300ms。

  • Time interpolation:时间差值,乍一看不知道是什么,但是我说LinearInterpolator、AccelerateDecelerateInterpolator,大家一定知道是干嘛的了,定义动画的变化率。

  • Repeat count and behavior:重复次数、以及重复模式;可以定义重复多少次;重复时从头开始,还是反向。

  • Animator sets: 动画集合,你可以定义一组动画,一起执行或者顺序执行。

  • Frame refresh delay:帧刷新延迟,对于你的动画,多久刷新一次帧;默认为10ms,但最终依赖系统的当前状态;基本不用管。

相关的类:

  • ObjectAnimator 动画的执行类,后面详细介绍

  • ValueAnimator 动画的执行类,后面详细介绍

  • AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。

  • AnimatorInflater 用户加载属性动画的xml文件

  • TypeEvaluator 类型估值,主要用于设置动画操作属性的值。

属性动画的执行类:ObjectAnimator 和 ValueAnimator

ValueAnimator:属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡。

它的用法也超级简单,代码:

ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 500f);

    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float deltaY = (float)animation.getAnimatedValue();
            iv.setTranslationY(deltaY);
        }
    });
    //默认duration是3000毫秒
    valueAnimator.setDuration(3000);
    valueAnimator.start();

上面的代码意思其实就是:我们通过构造函数指定了动画的起始值为0,终止值为500,动画的默认持续时间是3000毫秒,我们通过setDuration()方法设置为3000毫秒。该动画会在3秒内,将值从0到500动画渐变。ValueAnimator提供了一个addUpdateListener方法,可以通过该方法向其添加AnimatorUpdateListener类型的监听器。AnimatorUpdateListener有一个onAnimationUpdate方法,ValueAnimator会每隔一定时间(默认间隔10ms)计算属性的值,每当计算的时候就会回调onAnimationUpdate方法。效果如下:
这里写图片描述

ObjectAnimator:继承自ValueAnimator,是可以直接对任意对象的任意属性进行动画操作的。

我们常常用到的类就是ObjectAnimator,它既然是继承自ValueAnimator,所以ValueAnimator的方法他都可以使用的。要让属性动画渐变式地更改对象中某个属性的值,可分两步操作:第一步,动画需要计算出某一时刻属性值应该是多少;第二步,需要将计算出的属性值赋值给动画的属性。ValueAnimator只实现了第一步,也就是说ValueAnimator只负责以动画的形式不断计算不同时刻的属性值,但需要我们开发者自己写代码在动画监听器AnimatorUpdateListener的onAnimationUpdate方法中将计算出的值通过对象的setXXX等方法更新对象的属性值。

1.ObjectAnimator平移动画的实现:

 float value1 = 0f;
 float value2 = 500f;
 final ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "translationY", value1, value2);
 objectAnimator.setDuration(3000);
 objectAnimator.start();

这段代码实现的效果和上图是一样的,是不是更简单了,由此可见,ObjectAnimator比ValueAnimator更进一步,其会自动调用对象的setXXX方法更新对象中的属性值。

2.ObjectAnimator透明动画的实现:

 ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "alpha", 1f, 0,1f);
 objectAnimator.setDuration(3000);
 objectAnimator.start();

这里第一个参数要求传入一个object对象,我们想要对哪个对象进行动画操作就传入什么,这里我传入了一个iv。第二个参数是想要对该对象的哪个属性进行动画操作,由于我们想要改变iv的不透明度,因此这里传入”alpha”。后面的参数就是不固定长度了,想要完成什么样的动画就传入什么值,这里传入的值就表示将TextView从常规变换成全透明,再从全透明变换成常规。之后调用setDuration()方法来设置动画的时长,然后调用start()方法启动动画,效果如下图所示:
这里写图片描述
3.ObjectAnimator缩放动画的实现:

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "scaleY", 1f, 3f,1f);
objectAnimator.setDuration(3000);
objectAnimator.start(); 

上面的代码就是把iv在垂直方向上放大3倍再还原,效果如下:
这里写图片描述

4.ObjectAnimator旋转动画的实现:

 ObjectAnimator animator = ObjectAnimator.ofFloat(iv, "rotation", 0f, 360f);
 animator.setDuration(5000);
 animator.start();

这个是旋转360度,效果如下:
这里写图片描述

5.组合动画:实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:

  • playSequentially(Animator anim,Animator anim,…); 将传入的动画顺序播放
  • playTogether(Animator anim,Animator anim,…);将传入的动画一起播放

  • after(Animator anim) 将现有动画插入到传入的动画之后执行

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

  • before(Animator anim) 将现有动画插入到传入的动画之前执行

  • with(Animator anim) 将现有动画和传入的动画同时执行

有了这四个方法,我们就可以任意组合了,

        ObjectAnimator translationY = ObjectAnimator.ofFloat(iv, "translationY", 0f, 500f,0f);
        ObjectAnimator alpha = ObjectAnimator.ofFloat(iv, "alpha", 1f, 0,1f);
        ObjectAnimator scaleY = ObjectAnimator.ofFloat(iv, "scaleY", 1f, 3f,1f);
        ObjectAnimator rotation = ObjectAnimator.ofFloat(iv, "rotation", 0f, 360f);
        AnimatorSet animSet = new AnimatorSet();
        animSet.play(alpha).with(scaleY).with(rotation).after(translationY);
        animSet.setDuration(5000);
        animSet.start();

这两种方式都是可以实现效果的,这里我们先是把4个动画的对象全部创建出来,然后new出一个AnimatorSet对象之后将这三个动画对象进行播放排序,让旋转和缩放和淡入淡出动画同时进行,并把它们插入到了平移动画的后面,最后是设置动画时长以及启动动画。运行一下上述代码,效果如下图所示:
这里写图片描述

属性动画的基本用法就完了,虽然这些都是最简单的,但是无论多么复杂的动画,都是这些简单的动画组合起来的。

github源码下载

猜你喜欢

转载自blog.csdn.net/gemgaozhen/article/details/53288150