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源码下载

更多相关文章

  1. Android(安卓)---Application 开发中共享全局数据
  2. Android中List的padding设置
  3. Handler、Message、MessageQueue、Looper协作简析
  4. 第五章(2)Libgdx应用框架之启动类和配置
  5. Android: 采用 startActivityForResult 实现多个Activity间不同
  6. android 内存使用详情查询的几种方法
  7. Android(安卓)UI 设计之 TextView EditText 组件属性方法最详细
  8. Android开发自动生成的AndroidManifest.xml中的allowBackup属性
  9. Android(安卓)App启动过程

随机推荐

  1. Android(安卓)2.3 Rotation and Orientat
  2. android ListView监听滚动条滚动到底部时
  3. 开源android项目分享
  4. android百度地图半径画圆
  5. Android学习笔记(5)——Android——Hello
  6. LinearLayout 线性布局
  7. Android(安卓)Audio代码分析23 - attachA
  8. ANDROID与.Net之间JSON实践
  9. 【笔记】android捕获触摸事件
  10. android app rate on google play and am