引言
Android动画分为两类, 分别是视图动画(View Animation)和属性动画(Property Animation)。其中View动画又分为帧动画(Frame Animation)和补间动画(Tween Animation),帧动画可以去加载一系列可绘制的Drawable逐帧实现动画,补间动画可以执行一系列简单的变化,这些变化包括旋转、位移、缩放等等。
1 帧动画(Frame Animation)
帧动画顾名思义就是由图片按照顺序一帧一帧组合而成的动画。如下图1-1所示,图片按照run_1到run_16播放就可以形成一个跑步的动画。
Android实现帧动画有两种方式,一种是xml文件实现,这种方式是帧动画最常用的实现方式,另一种是JAVA代码方式实现。它们的本质都是通过使用AnimationDrawable按顺序添加一系列Drawable来创建动画,并把动画赋值给View对象。
图1-1 跑步素材
1.1 xml实现帧动画
在Drawable下新建文件,然后使用animation-list并嵌套一系列的item,每一个item代表着一帧。<?xml version="1.0" encoding="utf-8"?>
android:oneshot="false" >
下面是核心代码,首先获取AnimationDrawable,然后赋值给iamgeview做背景,最后调用AnimationDrawable的start、stop方法,就可以像图1-2一样开始动画或者停止动画。//获取动画
animationDrawable = (AnimationDrawable) getResources().getDrawable(R.drawable.run_anim);
img.setImageDrawable(animationDrawable);
//开始播放动画
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (animationDrawable !=null && !animationDrawable.isRunning()) {
animationDrawable.start();
}
}
});
//停止播放动画
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (animationDrawable !=null &&animationDrawable.isRunning()) {
animationDrawable.stop();
}
}
});
1.2 JAVA代码实现帧动画
首先实例化AnimationDrawable,然后再获取Drawable下的资源文件,按照顺序逐帧添加到AnimationDrawable中,最后将AnimationDrawable赋值给View对象使用。private void createAnimation() {
animationDrawable =new AnimationDrawable();
int id;
for (int i =1; i <=16; i++) {
id = getResources().getIdentifier("run_" + i,"drawable", getPackageName());
//根据id获取到Drawable
Drawable drawable = getResources().getDrawable(id);
animationDrawable.addFrame(drawable,50);
}
//是否只运行一次
animationDrawable.setOneShot(false);
//给imageView设置动画
img.setImageDrawable(animationDrawable);
}
图1-2 Frame Animation
2 补间动画(Tween Animation)
补间动画是通过执行一系列变化来达到动画效果的,这一系列的变化包括旋转(rotate)、位移(translate)、缩放(scale)和透明度(alpha),对应的类包括 RotateAnimation,TranslateAnimation,ScaleAnimation,AlphaAnimation,AnimationSet五个类,它们都继承自Animation抽象类。补间动画的实现方式也是两种,第一种是在xml文件中实现,另一种是JAVA代码实现。
因为对应的五个类继承自Animation,所以它们也继承了Animation的属性,除此之外它们还有自己特有的属性。下列是继承自Animation的属性:android:duration="long" //定义动画运行时间,单位:毫秒。
android:fillAfter="boolean" //定义动画结束后应用动画转变(是否停留在最后一帧)。默认值是false。
android:fillBefore="boolean" //定义动画开始之前应用动画转变(是否直接从动画转变的第一帧开始)。默认值为true。
android:fillEnaabled="boolean" //如果为true则应用fillBefore的值,否则忽略fillBefore的值。默认值为false。
android:interpolator="@[+][package:]type/name" | "?[package:]type/name" //定义动画过渡用的插值器,例如:android:interpolator="@android:anim/linear_interpolator"。
android:repeatCount="int" //定义动画重复多少次。默认值为0。
android:repeatMode=["restart " | "reverse"] //定义repeatCount大于0时动画结束时的重复模式,restart 是从开始的地方重新播放,reverse是从结束的地方重新播放。默认值是restart。
android:startOffset="int" //定义动画开始前延迟,单位:毫秒。
android:zAdjustment=["bottom" | "normal" | " top"] //允许调整动画在运行期间的z轴顺序。默认值为normal。
android:detackWallpaper="boolean" //窗口动画特殊属性,如果这个窗口在壁纸之上,请不要使用它为墙纸设置动画。
2.1 旋转(rotate)
RotateAnimation是控制对象旋转的动画,这个旋转发生在X-Y平面上。你可以指定旋转的中心点,其中(0,0)是左上角的点,如果你不指定中心点,那么(0,0)就是默认的旋转中心点。
旋转特有的属性:android:fromDe