安卓动画总结

来源:互联网 发布:无限极 树 mysql 编辑:程序博客网 时间:2024/06/02 00:17

相关知识依然学习自任玉刚老师的安卓开发艺术探索,但是是本人自己的总结。


安卓中有三种动画,视图动画、帧动画和属性动画。严格的说帧动画也属于视图动画,只是使用方法等都略有不同。

1.插值器和估值器

首先来了解动画中的两个常用类,插值器和估值器。这两个类的功能和代码都非常简单,插值器根据当前的时间进度百分比计算出操作属性值改变的百分比,估值器则根据这个计算出的百分比来计算改变后属性的值。举个例子,在一个匀速位移动画里,时间走了一半,也就是0.5,那么插值器就会计算出属性也应该改变0.5,然后估值器会计算出坐标增加0.5位移量后的量。(默认插值器是先加速后减速)

想要做出绚丽的动画效果,免不了要自定义这两个,自定义插值器要实现Intepolator接口,接口中的getInterpolation方法直接接受时间流逝百分比作为参数,使用起来很方便。自定义估值器要实现TypeEvaluator接口,方法参数也很明确清晰。


2.视图动画

视图动画和属性动画都可以通过xml文件和代码两种方式实现,视图动画推荐用xml实现(可读性更好),属性动画推荐用代码实现(有些属性需要处理)。

视图动画分为平移、缩放、旋转、透明度四种,对应Animation的四个子类。


来看xml实现:文件在res/anim目录下,根标签是set,有两个属性,interpolatoe表示插值器,shareInterpolator表示是否内部各分动画共享插值器。

重要属性还有durarion动画时间,fillAfter动画结束后是否留在现位置。

几个子标签<alpha/scale/translate/rotate>使用比较简单,属性就不展开了。

使用时用AnimationUtils.loadAnimation获取动画,然后调用组件的startAnimation即可。


3.帧动画

定义方法见代码

<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android">    <item android:drawable="@drawable/a" android:duration="500"/>    <item android:drawable="@drawable/b" android:duration="500"/></animation-list>
需要注意的是这个xml文件在drawable目录下,否则没有这个标签。每一张图片的时间分别设置。

使用时将这个文件设置为组件背景,调用组件的getBackground获取AnimationDrawable对象,然后start就可以了。


4.属性动画

属性动画能操作的就不只视图动画那四种效果了,理论上属性动画能对一切对象属性进行操作。基本的类有三个,ValueAnimator,  ObjectAnimator,   AnimatorSet。AnimatorSet也就是几个动画效果的集合。ValueAnimator的功能是对一个值进行一段时间的持续变化赋值(变换),ObjectAnimator是对目标组件属性的值进行变换。ObjectAnimator继承自ValueAnimator,其实原理就是在ValueAnimator的基础上在每次产生变化的值的时候调用目标组件的set属性方法。平时常用的也就是这个ObjectAnimator.

清楚动画类的基本工作原理后,我们也就知道,传入动画方法的属性必须有相应的get和set方法,而且方法确实能够改变这个属性值,才能达到我们想要的效果。举个例子,View的widrh属性有set方法,但是这个方法其实并不能改变组件的宽度(详见源码),所以传入width属性组件的宽度并不会有变化。

先来看xml中的属性动画实现,q文件在res/animator下:

<?xml version="1.0" encoding="utf-8"?><set    android:ordering="sequentially"    xmlns:android="http://schemas.android.com/apk/res/android">    <objectAnimator        android:propertyName="x"        android:duration="100"        android:valueFrom="0"        android:valueTo="100"        android:startOffset="100"        android:repeatCount="-1"        android:repeatMode="restart"        android:valueType="intType"/>    <animator android:duration="100"        android:valueFrom="0"        android:valueTo="100"        android:startOffset="100"        android:repeatCount="-1"        android:repeatMode="restart"        android:valueType="intType"/></set>
animator对应的就是ValueAnimator,相对于ObjectAnimator少了一个属性propertyName,也就是要改变的属性名。

set的属性ordering表示播放顺序,together表示同时播放,sequentially表示按顺序。

startOffset指播放前的延迟。repeatCount循环次数,-1表示无限循环。repeatMode循环模式,restart重新开始,reverse倒着重播。

应用:

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(this,R.animator.animt);        set.setTarget(target);        set.start();


在代码中实现动画则更加简单:

ObjectAnimator.ofInt(target,"x",100).setDuration(500).start();
第二个参数就是属性名,当然,在链式代码中还可以设置估值器等。

多个动画组合:

AnimatorSet set=new AnimatorSet();        set.playTogether(                ObjectAnimator.ofInt(target,"x",100),                ObjectAnimator.ofInt(target,"y",100)        );        set.setDuration(500).start();

pT的参数是一个不定数组,就是几个动画对象。


5.位移动画效果:

在3.0以前,视图动画和属性动画位移后实际位置都不会改变,也就是只有点击原位置能得到响应。3.0以后的属性动画位移后实际位置移动。







0 0