前言
此篇主要介绍Tween Animation(补间动画)和Frame Animation(逐帧动画)的使用。
Tween Animation 补间动画
通过旋转、拉伸、移动等方式完成图像的动画效果。
语法格式
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true" | "false"] >
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float" />
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
<set>
...
</set>
</set>
解析说明:
android:interpolator 分类器,主要控制动画播放的类型。android默认的类型有如下几种:
AccelerateDecelerateInterpolator@android:anim/accelerate_decelerate_interpolator | 在动画开始与结束的地方速率改变比较慢,在中间的时候加速 |
AccelerateInterpolator@android:anim/accelerate_interpolator | 在动画开始的地方速率改变比较慢,然后开始加速 |
AnticipateInterpolator@android:anim/anticipate_interpolator | 开始的时候向后然后向前甩 |
AnticipateOvershootInterpolator@android:anim/anticipate_overshoot_interpolator | 开始的时候向后然后向前甩一定值后返回最后的值 |
BounceInterpolator@android:anim/bounce_interpolator | 动画结束的时候弹起 |
CycleInterpolator@android:anim/cycle_interpolator | 动画循环播放特定的次数,速率改变沿着正弦曲线 |
DecelerateInterpolator@android:anim/decelerate_interpolator | 在动画开始的地方快然后慢 |
LinearInterpolator@android:anim/linear_interpolator | 以常量速率改变 |
OvershootInterpolator@android:anim/overshoot_interpolator | 向前甩一定值后再回到原来位置 |
android:shareInterpolator 取值为true的时候,表示设置的interpolator同样适用于所有子元素。
android:pivotX和android:pivotY表示中心点,中心轴。比如旋转中心点或者缩放的中心点。
alpha的属性from和to的取值范围是0.0到1.0。
scale的属性from和to的取值如果是1.0则表示大小不变,<1.0表示缩小,>1.0表示放大。
translate的属性from和to的取值可以是数值或者百分比,数值:比如30,表示移动的30个像素的距离;百分比,比如50%,表示相对于父容器的长宽的百分比。
rotate的属性from和to表示旋转的角度,单位是度。取值从0度到360度,其中android:pivotX和android:pivotY的取值可以是具体数值(相对于父容器top和left的距离值)或者百分比(相对于父容器长宽的百分比)。
使用
我们举一个例子,来学习Tween Animation的具体使用。效果如下:
1、res/animator/tween_animation.xml的代码:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/cycle_interpolator">
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%" />
</set>
说明:其中interpolator属性设置的是cycle_interpolator,表示在一定的时间内循环播放特定的次数,速率是延着正弦曲线而变化。
rotate表示旋转,从0到360度,中心轴是父容器的正中心(50%,50%)。
2、activity中的代码:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.tween_animation_view);
imageView = (ImageView) findViewById(R.id.imageView);
//初始化Animation对象
Animation animation = AnimationUtils.loadAnimation(this, R.animator.tween_animation);
animation.setDuration(5000);//动画持续时间
imageView.startAnimation(animation);//播放动画
}
其他
透明度动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha
android:fromAlpha="0"
android:toAlpha="1" />
</set>
效果:
缩放动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
android:fromXScale="0"
android:toXScale="2"
android:fromYScale="0"
android:toYScale="2"
android:pivotX="50"
android:pivotY="50" />
</set>
效果:
移动动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:fromXDelta="0"
android:toXDelta="200"
android:fromYDelta="0"
android:toYDelta="200" />
</set>
效果:
Frame Animation逐帧动画
逐帧动画其实很简单,就是降一组图片按照顺序进行播放。
语法格式
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource_name"
android:duration="integer" />
</animation-list>
说明:
android:oneshot取值为true则动画只执行一次,false则循环执行。
使用
1、准备一组图片,如下:
2、res/drawable/frame_animation.xml代码:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@drawable/logo_loading1"
android:duration="200" />
<item
android:drawable="@drawable/logo_loading2"
android:duration="200" />
<item
android:drawable="@drawable/logo_loading3"
android:duration="200" />
...
...
...
<item
android:drawable="@drawable/logo_loadingN"
android:duration="200" />
</animation-list>
3、以上frame animation的xml文件定义完成,下面看如何使用:
activity中的代码:
private ImageView imageView;
private AnimationDrawable rocketAnimation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.frame_animation_view);
imageView = (ImageView) findViewById(R.id.imageView);
//将FrameAnimation赋值给ImageView的bg。
imageView.setBackgroundResource(R.drawable.frame_animation);
//获得bg的drawable对象,强制转换为AnimationDrawable
rocketAnimation = (AnimationDrawable) imageView.getBackground();
//播放动画
rocketAnimation.start();
}
效果:
结束
以上介绍了Tween Animation和Frame Animation的用法。其中关于Tween中提到的Interpolator属性,如果android自带的不能满足要求,我们还可以对interpolator进行自定义。