一、帧动画(Frame Animation)
帧动画也叫Drawable Animation,是最简单最直观的动画类型,它利用人眼的视觉暂留效应一也 就是光对视网膜所产生的视觉在光停止作用后,仍会保留一段时间的现象。在Android中实现逐帧动画,就是由设计师给出一系列状态不断变化的图片,开发者可以指定动画中每一帧对应的图片 和持续的时间,然后就可以开始播放动画了。具体而言,有两种方式可以定义逐帧动画,分别是采用XML资源文件和代码实现。
前期准备:将一系列不间断变化的图片放到资源文件夹:res/drawable当中,然后在drawable目录中新建一个动画XML文件,在这个文件中使用<animation-list>标签来定义动画帧序列,使用<item> 标签来定义动画的每一帧,并在其中指定帧的持续时间等属性,格式如下
格式.png1.代码实现方式 :
AnimationDrawable animationDrawable = new AnimationDrawable();
for (int i = 1; i <10 ; i++) {
// getResources().getIdentifier("对应的图片名称","图片存放的文件夹","包名");
int id = getResources().getIdentifier("a"+i,"drawable",getPackageName());
Drawable drawable = getResources().getDrawable(id);
animationDrawable.addFrame(drawable,200);
}
mImageView.setBackground(animationDrawable);
animationDrawable.setOneShot(false);
AnimationDrawable anim= (AnimationDrawable) mImageView.getBackground();
anim.start(); // 动画开始
anim.stop(); // 动画结束
2.Xml实现方式
// xml 方式
mImageView.setBackground(getResources().getDrawable(R.drawable.anim_zhen));
AnimationDrawable anim= (AnimationDrawable) mImageView.getBackground();
anim.start(); // 动画开始
anim.stop(); // 动画结束
帧动画实现效果
二、补间动画(Tween Animation)
补间动画是指开发者无须定义动画过程中的每一帧,只需要定义动画的开发和结束这两个关键帧,并指定动画变化的时间和方式等,然后交由Android系统进行计算,通过在两个关键帧之间插人渐变值来实现平滑过渡,从而对View的内容完成- 系列的图形变换来实现的动画效果,主要包括四种基本的效果:透明度变化Alpha、大小变化Scale、位移变化Translate及旋转变化Rotate,这四种效果可以动态组合,从而实现复杂灵活的动画。同样,定义补间动画也可以分为XML资源文件和代码两种方式。
不过在这之前,我们首先来认识一下插值器 Interpolatoro
前面说到的Android系统会在补间动画的开始和结束关键帧之间插人渐变值,它依据的便是Interpolator。具体来说,Interpolator 会根据类型的不同,选择不同的算法计算出在补间动画期间所需要动态插入帧的密度和位置,Interpolator负责控制动画的变化速度,使得前面所说的四种基本动画效果能够以匀速、加速、减速、抛物线等多种速度进行变化。
Android SDK默认提供了几个Interpolator的实现类。我们认识一下:
插值器类型 | 功能作用说明 |
---|---|
AccelerateDecelerateInterpolator | 在动画开始与结束的时候速率改变比较慢,在中间的时候加速 |
Aceleratelnterpolator | 在动画开始的地方速率改变比较慢,然后开始加速 |
Antieipatenterpolator | 动画开始的时候先向后,然后向前滑动 |
AntieipateOvershotlnterpolator | 动画 开始的时候先向后,然后向前甩一定值后返回最后的值 |
Beseheplatea | 动画结束的时候弹起 |
Cyelelnterpolator | 动画循环播放特定的次数,速率的改变遵循正弦曲线 |
Deeleratlnterpolator | 在动画开始的地方速率改变比较快,然后开始变慢 |
Linearlnterpeolator | 动画以常 量速率进行改变 |
Oversbnolnterpolator | 动画向前甩一定值 后再回到原来位置 |
PathInterpeolator | 新增的通过定义路径坐标,动画可以按照路径坐标来运行;注意这里的坐标并不是指十字坐标系,而是单方向,也就是可以从0-1,然后弹回0.6后再弹到0.8,直到最后时间结束 |
动画类型
动画类型 | 功能说明 |
---|---|
AlphaAnimation | 改变透明度的动画,创建动画时需要指定动画开始和结束的透明度,以及动画持续时间,透明度取值范围是0到1 |
ScaleAnimation | 缩放大小的动画,创建动画时需要指定动画开始和结束时在X轴和Y轴的缩放比,以及动画持续时间;同时由于缩放时以不同的点作为中心会产生不同的效果,因此也需要通过pivoX和pivoaY指定缩放中心的坐标 |
TranalateAnimation | 改变位置的动画,创建动画时需要指定动画开始和结束时的X、Y坐标,以及动画的持续时间 |
RotateAnimation | 旋转动画,创建动画时需要指定动画开始和结束时的旋转角度,以及动画持续时间;同RotateAnimation由于旋转时以不同的点作为中心会产生不同的效果,因此也需要通过pivotX和pivotY指定旋转中心的坐标由于旋转时以不同的点作为中心会产生不同的效果,因此也需要通过pivotX和pivotY指定旋转中心的坐标 |
AlphaAnimation
XML方式就是在res/anim目录中新建XML文件,其中的内容如下。
<?xml version="1.0" encoding="utf-8"?>
<set android:fillAfter="false" xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="2000"
android:fromAlpha="1"
android:toAlpha="0.5"/>
</set>
Animation alphaAnimation = AnimationUtils.loadAnimation(this, R.anim.anim_tween_alpha);
mView.setAnimation(alphaAnimation);
alphaAnimation.start();
ScaleAnimation
ScaleAnimation alphaAnimation = new ScaleAnimation(1,0.3f,1,0.3f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
alphaAnimation.setDuration(2000);
imageViewTween.setAnimation(alphaAnimation);
//alphaAnimation.setFillAfter(true);// 是否保留动画结束效果
alphaAnimation.start();
参数 | 含义申明 |
---|---|
fromX | 动画开始时的X坐标的伸缩尺寸 |
toX | 动画结束时的X坐标的伸缩尺寸 |
fromY | 动画开始时的Y坐标的伸缩尺寸 |
toY | 动画结束时的Y坐标的伸缩尺寸 |
pivouX/pivouXValue | 缩放动画的中心点X坐标 |
pivouY/pivouYValue | 缩放动画的中心点Y坐标 |
pivolXType | 动画在X轴的伸缩模式,也就是中心点相对于哪个物件,取值是Animation.ABSOLUTE、Animation.REL ATIVE TO SELF或Animation.RELATIVE TO PARENT |
pivotYType | 动画在Y轴的伸缩模式,也就是中心点相对于哪个物件,取值是Animation.ABSOLUTEAnimation.RELATIVE TO SELF或Animation.RELATIVE TO PARENT |
TranalateAnimation
TranslateAnimation translateAnimation = new TranslateAnimation(0,100,0,100);
translateAnimation.setDuration(2000);
imageViewTween.setAnimation(translateAnimation);
//alphaAnimation.setFillAfter(true);// 是否保留动画结束效果
translateAnimation.start();
参数 | 含义申明 |
---|---|
fromXType | 动画开始时在X轴的位移模式,取值是Animation.ABSOLUTE、Animation.RELATIVE_TO_ SELF或Animation.RELATIVE TO PARENT |
fromXValue/fromXDelta | 动画开始时当前View的X坐标 |
toXType | 动画结束时在X轴的位移模式,取值是Animation.ABSOLUTE,Animation.RELATIVE_TO_ SELF或Animation.RELATIVE TO_ PARENT |
toXValue/toXDelta | 动画结束时 当前View的X坐标 |
fromYType | 动画开始时在Y轴的位移模式,取值是Animation.ABSOLUTE、Animation.RELATIVE_TO_ SELF或Animation.RELATIVE TO PARENT |
fromYValue/fomYDelta | 动画开始时当前View的Y坐标 |
toYType | 动画结束时在Y轴的位移模式,取值是Animation.ABSOLUTE、Animation.RELATIVE_TO_ SELF或Animation.RELATIVE TO_ PARENT |
toY Value/toYDelta | 动画结束时当前 View的Y坐标 |
RotateAnimation
RotateAnimation rotateAnimation = new RotateAnimation(0,270,0.3f,0.3f);
rotateAnimation.setDuration(2000);
imageViewTween.setAnimation(rotateAnimation);
//alphaAnimation.setFillAfter(true);// 是否保留动画结束效果
rotateAnimation.start();
参数 | 含义申明 |
---|---|
fromDegrees | 动画开始时的旋转角度 |
toDegrees | 动画结 束时的旋转角度 |
pivotXType | 动画在X轴的旋转模式,即相对于物件的位置类型,取值是Animation.ABSOLUTE、Animation.RELATIVE TO SELF或Animation.RELATIVE TO_ PARENT |
pivotXValue | 动画相对于物件的X坐标开始位置 |
pivotYType | 动画在Y轴的旋转模式,即相对于物件的位置类型,取值是Animation.ABSOLUTE、Animation.RELATIVE TO SELF或Animation.RELATIVE TO PARENT |
pivotYValue | 动画相对于物件的Y坐标开始位置 |
二、属性动画(Property Animation)
属性动画是在Android 3.0中引人的,在补间动画中,我们只能改变View的绘制效果,View的真实属性是没有变化的,而属性动画则可以直接改变View对象的属性值,同时属性动画几乎可以对任何对象执行动画,而不是局限在View对象上,从某种意义上讲,属性动画可以说是增强版的补间动画。与补间动画类似。
动画属性 | 说明 |
---|---|
动画持续时间 | 默认值是 300毫秒,在资源文件中通过android:duration指定 |
动画插值方式 | 详 见补间动画介绍,在资源文件中通过android:interpolator指定 |
动画重复次数 | 指定动画重复播放的次数,在资源文件中通过android:repeatCount指定 |
动画重复模式 | 指定一次动画播放结束后,重复下次动画时,是从开始帧再次播放到结束帧,还是从结束帧反方向播放到开始帧,在资源文件中通过android:epeatMode指定 |
帧刷新频率 | 指定间隔多 长时间播放一帧, 默认值是10毫秒 |
动画集合 | 通过动画集合可以将多个属性动画组合起来,同时通过指定android:ordering属性可以控制这组动画是按次序播放还是同时播放,在资源文件中通过<se/../set.>来表示 |
属性动画的基类是Animator, 它是- - 个抽象类,所以不会直接使用这个类,通常都是继承它并重写其中的相关方法,Android SDK为开发者默认提供了几个子类,大多数情况下使用这些子类就足够完成开发任务了。
网友评论