Android 的动画可以大致分为三种:View动画,帧动画,属性动画,其实帧动画也可以归类为View动画,只是它和常见的View动画(比如平移、旋转等)表现形式上略有不同而已。
在正式讲动画之前还需要了解两个概念:插值器和估值器。
也就是说,借助插值器和估值器,我们可以在均匀的时间变化下,得出自己想要的非均匀的属性值变化,从而实现非匀速动画。
View动画的操作对象是View,它支持四种动画效果:平移动画,缩放动画,旋转动画以及透明度动画。虽然帧动画也属于View动画,但它和上述的四种动画效果相比,动画的形成原理并不相同,因此我打算分开来说。
4.1.通过XML文件实现View动画
1.首先在res/anim/目录下创建View动画的xml文件,文件名可以自定义。这里我创建了一个 translate_rotate_anim.xml 文件,如下:
其中
这里只用到了平移和旋转的复合动画, 其中平移动画中使用到的属性含义如下:
旋转动画中使用到的属性含义如下:
上述的pivot属性在缩放动画(标签为
最后透明度动画所使用的属性含义如下:
2.通过AnimationUtils工具类加载动画XML文件,然后为控件使用动画
private void bitmapTranslateAndRotate(){
Animation animation = AnimationUtils.loadAnimation(this,R.anim.translate_rotate_anim);
imageView.startAnimation(animation);
}
4.2.通过代码来应用动画
这里以透明度动画为例,如下:
private void bitmapAlpha(){
AlphaAnimation alphaAnimation = new AlphaAnimation(1,0);
alphaAnimation.setDuration(3000);
imageView.startAnimation(alphaAnimation);
}
在上面的代码中,创建了一个透明度动画,将一个ImageView的透明度在3秒内由1变为0。(由可见到不可见)
4.3.为View动画添加过程监听
animation.setAnimationListener(mAnimationListener);
具体来说可以监听动画的开始、结束以及重复播放事件,如下:
public static interface AnimationListener {
void onAnimationStart(Animation animation);
void onAnimationEnd(Animation animation);
void onAnimationRepeat(Animation animation);
}
LayoutAnimation 作用于 ViewGroup,它为ViewGroup指定一个动画 ,这样当它的子元素出场时都会具有这种动画效果。这里以ListView为例,具体实现步骤如下:
5.1.在res/anim/目录下新建布局动画文件,这里以list_view_anim.xml为例:
其中delay属性表示子元素开始动画的时间延迟,比如子元素入场动画时间周期为300ms,那么这里的0.5表示每个子元素都需要延迟150ms才能播放入场动画。总的来说,第一个子元素延迟150ms开始播放动画,第二个子元素延迟300ms开始播放,以此类推。animationOrder属性表示子元素动画的顺序,有三种选项:normal,reverse,random,分别代表着顺序播放,逆向播放和随机播放。最后的animation属性指定了子元素的具体入场动画。
5.2.编辑子元素的具体入场动画
这里就简单的展示一个从右边水平滑入的动画
5.3.为ListView指定LayoutAnimation
通过XML来设置动画的话,很简单直接在对应属性设置即可,如下:
android:layoutAnimation="@anim/list_view_anim"
也可以通过代码控制来设置LayoutAnimation,如下:
Animation animation = AnimationUtils.loadAnimation(this,R.anim.list_item_anim);
LayoutAnimationController controller = new LayoutAnimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
mListView.setLayoutAnimation(controller);
帧动画是顺序播放一组预先定好的图片,类似于电影播放。不同于View动画,系统提供了另外一个类 AnimationDrawable 来使用帧动画。
1.通过XML来定义一个 AnimationDrawable,在res/drawable/目录下新建一个frame_animation.xml文件如下:
2.然后将上述的 Drawable 作为 View 的背景并通过 Drawable 来播放动画即可:
imageView = findViewById(R.id.imageView);
imageView.setBackgroundResource(R.drawable.frame_animation);
AnimationDrawable drawable = (AnimationDrawable) imageView.getBackground();
drawable.start();
值得注意的是,要避免使用过多较大的图片防止OOM的发生。