标签:
转载请标明出处: http://blog.csdn.net/Airsaid/article/details/51591239
本文出自:周游的博客
上一篇博客中写了逐帧动画(Frame)的使用,Android中除了支持逐帧动画(Frame)之外,也提供了对补间(Tween)动画的支持。补间动画就是指开发者只需要指定动画的开始、结束等“关键帧”,而动画的变化的“中间帧”则由系统计算并补齐。这也是“补间”二字的来意。
补间动画对应的类是:Animation。由于Animation是个抽象类,所以我们在使用的时候需要使用它的子类,补间动画的继承关系见下图:
Java类名 | XML关键字 | 描述信息 |
---|---|---|
ScaleAnimation | <scale> |
渐变尺寸伸缩动画效果 |
TranslateAnimation | <translate> |
画面转换位置移动动画效果 |
AnimationSet | <set> |
一个持有alpah、scale、translate、rotate或者其他set元素的容器 |
AlphaAnimation | <alpha> |
渐变透明度动画效果 |
RotateAnimation | <rotate> |
画面转移旋转动画效果 |
接下来详细的介绍一下补间动画的使用。
JAVA方法 | XML属性 | 解释 |
---|---|---|
setDetachWallpaper(boolean) | android:detachWallpaper | 是否在壁纸上运行 |
setDuration(long) | android:duration | 设置动画持续时间,单位为毫秒 |
setFillAfter(boolean) | android:fillAfter | 控件动画结束时控件是否保持动画最后状态 |
setFillBefore(boolean) | android:fillBefore | 控件动画结束时控件是否还原到开始动画前的状态 |
setFillEnable(boolean) | android:fillEnable(boolean) | 与android:fillBefore效果相同 |
setInterpolator(boolean) | android:interpolator | 设置插值器(指定的动画效果,如:回弹等) |
setRepeatCount(int) | android:repeatCount | 重复次数 |
setRepeatMode(int) | android:repeatMode | 重复类型:reverse倒序回放、restart从头播放 |
setStartOffset(long) | android:startOffset | 调用start函数后等待开行运行的时间,单位为毫秒 |
setZadjustment(int) | android:zAdjustment | 表示被设置动画的内容运行时在Z轴的位置(top/bottom/normal),默认为normal |
由于Animation类是其抽象父类,那么我们在使用补间动画无论是哪一种都已经具备了以上属性。
下面是每一种补间动画的特有属性:
JAVA方法 | XML属性 | 解释 |
---|---|---|
AlphaAnimation(float fromAlpha,…) | android:fromAlpha | 动画开始的透明度(0.0到1.0,0.0是全透明,1.0是不透明) |
AlphaAnimation(…, float toAlpha) | androdi:toAlpha | 动画结束的透明度(同上) |
JAVA方法 | XML属性 | 解释 |
---|---|---|
RotateAnimation(float fromDegrees, …) | android:fromDegress | 旋转开始角度,正代表顺时针度数,负代表逆时针度数 |
RotateAnimation(…, float toDegress) | android:toDegress | 旋转结束角度(同上) |
RotateAnimation(…, …, float pivotX, …) | android:pivotX | 缩放起点X坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点) |
RotateAnimation(…, …, …, pivotY) | android:pivotY | 缩放起点Y坐标(同上) |
JAVA方法 | XML属性 | 解释 |
---|---|---|
ScaleAnimation(float fromX, …) | android:fromXScale | 初始X轴缩放比例,1.0表示无变化 |
ScaleAnimation(…, float toX) | android:toXScale | 结束X轴缩放比例 |
ScaleAnimation(…, …, float fromY, …) | androd:fromYScale | 初始Y轴缩放比例 |
ScaleAnimation(…, …, …, float toY) | android:toYScale | 结束Y轴缩放比例 |
ScaleAnimation(…, float pivotX, …) | android:pivotX | 缩放起点X轴坐标(同上) |
ScaleAnimation(…, float pivotY) | android:pivotY | 缩放起点Y轴坐标(同上) |
JAVA方法 | XML属性 | 解释 |
---|---|---|
TranslateAnimation(float fromXDelta, …) | android:fromXDelta | 平移起始点X轴坐标 |
TranslateAnimation(…, float toXDelta) | android:toXDelta | 平移结束点X轴坐标 |
TranslateAnimation(…, float fromYDelta, …) | android:fromYDelta | 平移起始点Y轴坐标 |
TranslateAnimation(…, float toYDelta) | android:toYDelta | 平移结束点Y轴坐标 |
AnimationSet类比较特殊,因为该类是以上4类的组合容器管理类,没有自己特有的属性,它的属性继承自它的父类:Animation。
我们在使用的时候需要注意,当我们在对set标签设置属性的时候,那么其标签下的所有控件都会产生影响。
我们可以在代码以及XML中使用补间动画,Android官方文档中推荐我们使用XML文件定义补间动画,因为它更可读,可重复使用,并且支持swappable than hard-coding的动画。
XML布局中定义了五个按钮,分别对于如下的点击事件:
public void alpha(View v){
AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f);
anim.setDuration(1000);
v.startAnimation(anim);
}
public void rotate(View v){
RotateAnimation anim = new RotateAnimation(0.0f, -360f, v.getWidth()/2, v.getHeight()/2);
anim.setDuration(1000);
v.startAnimation(anim);
}
public void scale(View v){
ScaleAnimation anim = new ScaleAnimation(1.0f, 0.0f, 0.0f, 1.0f, v.getWidth() / 2, v.getHeight() / 2);
anim.setDuration(1000);
v.startAnimation(anim);
}
public void translate(View v){
TranslateAnimation anim = new TranslateAnimation(0.0f, 10.0f, 100f, 200f);
anim.setDuration(1000);
v.startAnimation(anim);
}
public void set(View v){
AnimationSet anim = new AnimationSet(this, null);
AlphaAnimation alpha = new AlphaAnimation(0.0f, 1.0f);
anim.setDuration(1000);
RotateAnimation rotate = new RotateAnimation(0.0f, -360f, v.getWidth()/2, v.getHeight()/2);
anim.setDuration(1000);
anim.addAnimation(alpha);
anim.addAnimation(rotate);
v.startAnimation(anim);
}
运行效果:
定义补间动画的XML资源应该放在/res/anim/路径下,当我们创建好项目,默认是不会有anim这个目录的,自己创建一个就行了。
设置补间动画的语法格式如下:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="持续时间"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator="boolean">
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:fromYScale="float"
android:pivotX="float"
android:pivotY="float"
android:toXScale="float"
android:toYScale="float" />
<translate
android:fromXDelta="float"
android:fromYDelta="float"
android:toXDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:pivotX="float"
android:pivotY="float"
android:toDegrees="float" />
</set>
上面的语法,包含了大量的fromXX..toXX..属性,这些属性就用于定义View的开始状态和结束状态,当进行缩放变换(scale)、旋转变换(rotate)时,还需要指定pivotX、pivotY两个属性,这两个属性指定变换的中心点,也就是基于哪个点进行缩放、旋转。duration则指定的动画的持续时间。
除此之外,上面的<alpha../>、<scale../>、<transslate../>、<rotate../>
都可指定一个android:interpolator属性,该属性指定动画的变化速度,可以实现匀速、正加速、负加速、无规则加速等,Android系统的R.anim类中包含了大量的常量,它们定义了不同的动画速度,其中包括:
* linear_interpolator:匀速变换。
* accelerate_interpolater:加速变换。
* decelerate_interpolater:减速变换。
下面详细讲解一下Interpolator的使用。
Interpolator在学校学习的时候翻译为了:“插值器“。它的具体作用是为了控制在动画期间需要动态“补入”多少帧,具体在动画运行的哪些时候补入帧。
Interpolator根据指定算法计算出整个动画所需要动态插入帧的密度和位置。简单来说,Interpolator负责控制动画的变化速度,这就使得基本的动画效果(Alpha、Scale、Translate、Rotate)能以匀速变化、加速、减速、抛物线等各种速度变化。
Interpolator是一个接口,它定义了所有Interpolator都必须实现的方法:float getInterpolator(float input),开发者完全可以通过实现Interpolator来控制动画的变化速度。Android为Interpolator提供了如下几个实现类,分别用于实现不同的动画变化速度。
以上Interpolator演示动画资源文件:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:interpolator="@android:anim/linear_interpolator">
<translate
android:fromYDelta="0"
android:toYDelta="1000" />
</set>
在代码中通过AnimationUtils.loadAnimation()方法加载了动画资源文件:
Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_interpolator);
mImage.startAnimation(animation);
继续下一篇: 自定义补间动画
标签:
原文地址:http://blog.csdn.net/airsaid/article/details/51591239