Android—Animation
一.Animation简介
1.简介 Animation为Android提供了一系列的动画效果:旋转、缩放、移动、淡入淡出,这些动画效果可以应用于绝大多数控件。
2.分类
Animation可分为两类:
TweenedAnimations:渐变动画,具体就是旋转、缩放、移动、淡入淡出效果。
Frame-by-FrameAnimations:将一系列Drawable序列一次播放,类似于电影模式,常用来进行定时更新背景等操作。
3.实现方法
Animation有两种实现方法:
在xml文件中实现,优点是复用性好,可维护性好,多个控件可以使用同一个xml文件。缺点是由于xml文件不进行编译,所以排错比较难。
在代码中实现,优点是排错很方便,缺点是重复代码多,可复用性低。
二.TweenedAnimations
1.效果
Alpha:淡入淡出
Scale:缩放
Rotate:旋转
Translate:移动
2.实现
在代码中实现
(1)创建AnimationSet对象(可以柔和多个动画效果)
AnimationSet是Animation的子类,一个AnimationSet包含了一系列的Animation,对AnimationSet属性的设置将会应用于其中的每一个Animation。
AnimationSet animationSet=new AnimationSet(true);
(2)根据需要创建相应的Animation对象(根据4种效果有4个子类)
淡入淡出: AlphaAnimation alphaAnimation=new AlphaAnimation(1,0); //两个参数分别表示初始透明度和目标透明度,
//1表示不透明,0表示完全透明。
旋转:RotateAnimation rotateAnimation=new RotateAnimation(0,360,Animation.RELATIVE_TO_PARENT,1f,Animation.RELATIVE_TO_PARENT,1f);
参数含义:
参数1:初始角度,0表示图片当前位置。
参数2:目标角度。
参数3、4、5、6定义了旋转的圆心
参数3:X坐标的类型,有三种默认值:RELATIVE_TO_PARENT 相对于父控件
RELATIVE_TO_SELF 相对于符自己
RELATIVE_TO_ABSOLUTE 绝对坐标
参数4:X轴偏移比例,变化范围是0f—1f
参数5:Y坐标的类型,同样也有三种默认值
参数6:Y轴偏移比例,变化范围是0f—1f
缩放:ScaleAnimation scaleAnimation=new ScaleAnimation(1,0.1f,1,0.1f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
参数含义:
参数1,2:X轴缩放比例—从1缩放到0.1
参数3,4:Y轴缩放比例—从1缩放到0.1
参数5,6:X轴轴心点(类型和比例)
参数7,8:Y轴轴心点(类型和比例)
移动:TranslateAnimation translateAnimation=new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0.5f);
参数含义:
参数1,2:X轴的开始位置
参数3,4:X轴的结束位置
参数5,6:Y轴的开始位置
参数7,8:Y轴的结束位置
(3)为Animation配置数据
这里说明一下TweenedAnimations的几个通用属性
.setDuration(long durationMills); //动画执行的时间,单位是毫秒。
.setFillAfter(boolean fillAfter); //设为true,则动画完成后停留在结束状态
.setFillBefore(boolean fillBefore); //设为true,则动画完成后停留在初始状态
.setStartOffset(long startOffset); //动画执行前的等待时间
.setRepeatCount(int repeatCount); //动画执行重复的次数
(4)将Animation对象加入AnimationSet中
animationSet.addAnimation(alphaAnimation);
(5)使用控件对象开始执行AnimationSet
***.StartAnimation(animationSet);
在xml中实现
(1)在res目录下新建anim文件夹
(2)在anim中创建xml文件,并首先加入set标签:
<set xmlns:android=“http://schemas.android.com/apk/res/android”
android:interpolator="@android:anim/accelerate_interpolator">
</set>
(3)在set标签中可加入rotate、alpha、scale或translate等标签。
例:
<rotate
android:fromDegrees="0" //起始角度
android:toDegrees="360" //目的角度,这里的角度可以写负数,这时会逆时针旋转
android:pivotX="%50" //X轴的旋转圆心,50,则对应RELATIVE_TO_ABSOLUTE ,50%,则对
//应 RELATIVE_TO_SELF ,50%p,则对应RELATIVE_TO_PARENT 。
android:pivotY="%50" //Y轴的旋转圆心
>
这些标签的具体使用可以查阅Android帮助文档。
(4)在代码中使用AnimationUtils装载xml,并生成Animation对象
Animation animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.***); //装载指定的xml文件
3.关于Interpolator
(1)简介
Interpolator定义了动画的速率,几种默认的Interpolator如下:
AccelerateInterpolator:动画开始时比较慢,然后逐渐加速。
DecelerateInterpolator:动画开始时比较快,然后逐渐减速。
AccelerateDecelerateInterpolator:动画开始时和结束时比较慢,中间过程加速。
LinearInterpolator:动画匀速进行。
CycleInterpolator:动画循环播放指定次数,速率沿着正弦曲线改变。
(2)实现
定义在代码中:
AnimationSet animationSet =new AnimationSet (true); //这里设置为true,则为animationSet 设置的Interpolator将
//应用于animationSet 中的所有animation对象。
animationSet .setInterpolator(new AccelerateInterpolator);//为animationSet 设置Interpolator。
或者:
AnimationSet animationSet =new AnimationSet (false);
animation1 .setInterpolator(new AccelerateInterpolator);
animation2.setInterpolator(new AccelerateInterpolator);
...... //为每一个animation对象设置Interpolator。
定义在xml中:
在set标签中添加属性,
android:shareInterpolator="true" //设置为true,则这时设置的Interpolator适用于标签中的所有动画。
android:interpolator="@android:anim/accelerate_interpolator” //为set设置Interpolator。
或者:
android:shareInterpolator="false" //设置为false,则需为每一个动画添加interpolator属性。
三.Frame-By-FrameAnimations
1.实现
(1)在drawable文件夹下创建xml文件:<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlms:android="http://schemas.android.com/apk/res/android"
android:onshot="false">
<item android:drawable=""@drawable/pic1 android:duration="500" />
<item android:drawable=""@drawable/pic2android:duration="500" />
<item android:drawable=""@drawable/pic3android:duration="500" />
</animation-list>
这个文件就定义了需要一次播放的图片资源,每一个<item>就是一个资源,drawable属性就是资源图片,duration指的是播放的时长。
(2) 代码中添加:
imageView.setBackgroundResource(R.drawable.***); //将创建的的xml装载进imageView
AnimationDrawable animationDrawable=(AnimationDrawable)imageView.getBackground();
animationDrawable.start(); //启动动画
四.LayoutAnimaionController
1.简介
LayoutAnimaionController为Layout或者viewGroup里的控件设置动画效果,特点是它会使其中的每个控件都有相同的动画效果,这些控件的动画效果可以在不同的时间显示出来。
2.实现(结合ListView使用)
LayoutAnimaionController同样即可以在代码中设置,也可以在xml中设置。
在代码中:
(1)创建Animation对象,使用构造函数或者装载xml都可以。
(2)创建LayoutAnimaionController对象
LayoutAnimaionController lac=new LayoutAnimaionController(animation);
(3)设置属性
lac.setOrder(LayoutAnimaionController .ORDER_NORMAL);//设置顺序
有三种默认顺序:
LayoutAnimaionController .ORDER_NORMAL // 顺序
LayoutAnimaionController .ORDER_REVERSE //反序
LayoutAnimaionController .ORDER_RANDOM //随机
lac.setDelay(***f);//设置执行动画的延迟时间,即时间间隔,单位是秒
(4)为ListView设置
listView.setLayoutAnimation(lac);
在xml文件中:
(1)在res/anim文件夹中创建xml文件
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android“
android:delay="0.5" //执行动画的延迟时间,即时间间隔,单位是秒
android:animationOrder="random"/"normal"/"reverse" //执行顺序
android:animation="@anim/***" //这是装载具体动画的xml文件
(2)在具体的布局文件中配置属性
android:layoutAnimation="@anim/***"
五.AnimationListener
1.简介
AnimationListener是一个监听器,它在动画执行的各个阶段会得到通知,并且调用相应的方法
2.方法
(1)onAnimationStart(Animation animation) 在动画开始的时候调用
(2)onAnimationEnd(Animation animation) 在动画结束的时候调用
(3)onAnimationRepeate(Animation animation) 在动画重复的时候调用
3.实现
(1)构造监听器
private class MyAnimationListener implements AnimationListener{
......在其中覆写三种方法
}
(2)使用
animation.setAnimationListener(new MyAnimationListener());