逐帧动画(Frame Animation)
逐帧动画也叫Drawable Animation,是最简单最直观的动画类型,它利用人眼的视觉暂留效应---也就是光对视网膜所产生的视觉在光停止后,仍会保留一段时间的现象。
在Android中实现逐帧动画,是由设计师给出一系列状态不断变化的图片,开发者可以指定动画中每一帧对应的图片和持续的时间,有两种方式可以定义逐帧动画,分别是采用xml资源文件和代码实现
1 XML资源文件方式
这是最常使用的方式,首先我们将每一帧的图片放到res/drawable目录中,然后再res/anim目录中新建一个动画XML文件,在这个文件中使用<animation-list>标签来定义动画帧序列,使用<item>标签来定义动画的每一帧,并在其中指定帧的持续时间等属性
其中android:onshot用来控制动画是否循环播放,如果取值为true,表示动画不会循环播放,否则动画将会循环播放,android:duration用来指定每一帧的播放持续时间
2 代码方式
定义好逐帧动画之后,可以在符合某个条件时触发或者停止播放动画
补间动画(Tween Animation)
补间动画是指开发者无需定义动画过程的每一帧,只需要定义动画的开发和结束这两个关键帧,并指定动画变化的时间和方式,然后交由Android系统计算,通过在两个关键帧之间插入渐变值来实现平滑过渡,从而对View的内容完成一系列的图形变换来实现动画效果,主要包括四种基本的效果:透明度变化Alpha,大小变化Scale,位移变化Translate及旋转变化Rotate,这四种效果可以动态组合,从而实现复杂灵活的动画,同样,定义补间动画也可以分为XML资源文件和代码两种方式。
插值器Interpolator
Interpolator 会根据类型的不同,选择不同的算法计算出在补间动画期间所需要动态插入帧的密度和位置,Interpolator 负责控制动画的变化速度,使得前面所说的四种基本动画能够匀速,加速,减速,抛物线等多种速度进行变化。
具体到Android代码中,Interpolator 类其实是一个空接口,它继承自TimeInterpolator,TimeInterpolator 时间插值器允许动画进行非线性运动变换,如加速和减速等,改接口中只有float getInterpolation(float input)这个方法,入参是一个0.0~1.0的值,返回值可以小于0.0也可以大于1.0.
Android SDK默认提供了几个Interpolator是实现类
Android SDK使用Animation类来表示动画类,上面介绍的补间动画四种基本类型分别对应
AlphaAnimation
XML方式就是在res/anim目录中新建XML文件
AlphaAnimation 的构造函数只有两个参数,分别是初始的透明度和接受的透明度,语句如下。
在代码中实现透明度动画很简单,只需创建一个AlphaAnimation实例,然后设置动画持续时间即可
ScalaAnimation
XML实现示例如下
在代码中实现,ScaleAnimation可用的构造函数有三个,代码如下
ScaleAnimation 的使用如下
TranslateAnimation
XML实现实例如下
在代码实现中,TranslateAnimation可用的构造函数有两个:
TranslateAnimation的使用如下
RotateAnimation
XML实例示例如下
在代码实现中,RotateAnimation可用的构造函数有三个,代码如下
其中入参的含义
RotateAnimation的使用如下
自定义补间动画
自定义补间动画只需要继承Animation,并重写这个抽象基类中的applyTransformation方法,在其中实现具体的动画变换逻辑
interpolatedTime表示动画的时间进行比,无论动画的实际持续时间是多少,这个参数总是回从0变化到1,transformtion表示补间动画在不同时刻对View的变形程度。
网友评论