前言
Android 的动画可以分为三种:View 动画(view animation),帧动画(drawable animation)以及 属性动画(property animation)。属性动画是API11的新特性,不能再低版本中直接使用,但是我们可以通过兼容库来使用它。接下来,本文会主要讲解View动画和帧动画的使用,以及一些特殊的使用场景。
View 动画
View动画 即:补间动画(Tween Animation),通过对场景里的对象不断地做图像变换,从而产生动画效果,他是一种渐进式的动画,并且View动画支持自定义。
View动画包括四种动画效果:平移动画,缩放动画,旋转动画和透明度动画。
名称 | 标签 | 效果 |
---|---|---|
平移动画 | 移动 View | |
缩放动画 | 放大或缩小 View | |
旋转动画 | 旋转 View | |
透明度动画 | 改变View的透明度 |
View 动画的使用,需要编写动画xml文件,存放的路径呢? 是在res/anim/ 文件夹下面。下面来看一下,xml文件的语法格式:
- 平移动画
- 缩放动画
- 旋转动画
- 透明度动画
除了以上各个View动画 特有的属性之外,他们还存在着许多共有的属性。
属性 | 描述 |
---|---|
android:duration="long" | 动画的持续时间,单位:毫秒 |
android:fillAfter=["true" , "false"] | 动画结束时,是否保持动画的结束状态 |
android:fillBefore=["true" , "false"] | 动画结束时,是否恢复至最开始的状态 |
android:fillEnabled =["true" , "false"] | 同 android:fillBefore |
android:interpolator ="@[package:]anim/interpolator_resource" | 设置插值器 |
android:repeatCount="int" | 动画的重复播放次数 |
android:repeatMode=["reverse" or "restart"] | 重复类型,reverse:倒序回放,restart:从头播放 |
android:startOffset="long" | 调用start函数之后等待开始运行的时间,单位为毫秒 |
android:zAdjustment = ["top","normal","bottom"] | 动画运行在Z轴上的位置,默认值为normal |
以上介绍都是各个View动画的单独使用 ,通常的应用场景中是需要我们 对各种View动画的结合使用,
如何应用上面的动画呢?也很简单,如下所示。
// AnimationUtils.loadAnimation(Context context, int id);
Animation animation = AnimationUtils.loadAnimation(this, R.anim.modal_in);
view.startAnimation(animation);
同时,通过Animation 的setAnimationListener 方法可以给View动画添加过程监听,接口如下:
public static interface AnimationListener {
//动画开始
void onAnimationStart(Animator animation);
//动画结束
void onAnimationEnd(Animator animation);
//动画重复
void onAnimationRepeat(Animator animation);
}
帧动画
帧动画是顺序播放一组预先定义好的图片,类似于电影播放。不同于View 动画,系统提供了另外一个雷AnimationDrawable 来使用帧动画。对于来说,使用起来比较简单,这里首先需要用到另一个 集合标签
文件的存放路径:res/drawable/file_source.xml
然后将上述的 动画 作为View的背景并通过AnimationDrawable 来播放即可:
view.setBackgroundResource(R.drawable.file_source);
AnimationDrawable animationDrawable = (AnimationDrawable)view.getBackground();
animationDrawable.start();
帧动画使用比较简单,但是比较容易引起OOM,所以在使用帧动画时,应尽量避免使用过多尺寸的图片。
View 动画的特殊使用
View 动画除了单纯的用于 单个View 的动画形式, 还可以在一些其他的特殊的使用,例如:控制 ViewGroup 的子View 的出场效果,或者Activity的切换效果。
LayoutAnimation
用于设置 ViewGroup 子View 的显示动画效果。 下面就让我们通过一个例子来学习一下:
- 首先定义layoutAnimation 动画,它有三个属性:
- android:animation 指定子元素所要显示的View动画效果
- android:animationOrder 指定子元素的动画显示顺序 提供了三种模式:normal 正常顺序 random 随机播放 reverse 倒序
- android:delay 指定子元素动画效果的延迟,比如说:view动画的 duration 设置为 500 ms,那么 delay 为 0.5 ,子元素之间将相差250ms 的依次播放动画。
// res/anim/anim_layout.xml
// res/anim/anim_item.xml
- 为ViewGroup 设置android:layoutAnimation 属性,这一以ListView 为例:
这样就完成了 ViewGroup 动画的设置。当然,出了通过xml 指定之外,我们也可以通过代码来实现,这就需要用到一个类 LayoutAnimationController :
Animation animation = AnimationUtils.loadLayoutAnimation(this, R.anim.anim_item);
LayoutAnimationController controller = new LayoutAnimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
listView.setLayoutAnimation(controller);
总结
通过 View 动画我们基本就可以实现一些比较实现一些比较绚丽的效果了,但在使用过程中还是需要注意一些问题的:
- OOM问题 :这个问题主要针对 帧动画 ,我们要尽量避免使用太多和太大的图片,不然极容易出现OOM。
- View 动画并不能改变 View的位置,即使视觉上改变了位置,但点击事件仍在 原位置生效。
动画其他:android动画入门:属性动画