Animation概述
Android中动画主要分为四种:补间动画(Tween Animation)、帧动画(Frame Animation)、布局动画(Layout Animation )、属性动画(Property Animation)。
Tween Animation(补间动画)
补间动画又分为四种,分别是Alpha(渐变透明度动画)、Scale(渐变尺寸缩放动画)、Translate(位置移动动画)、Rotate(旋转动画),补间动画文件需要放在res\anim目录中。
补间动画的共同属性
(2)fillAfter:设置为true,动画转化在动画结束被应用
(3)fillBefore:设置为true,动画转化在动画开始前被应用
(4)interpolator:动画插入器(加速、减速插入器)
(5)repeatCount:动画重复次数
(6)repateMode:顺序重复/倒序重复
(7)startOffset:动画之间的时间间隔
Animation实现方式
(1)配置文件(/res/anim)—alpha,scale,translate,rotate
(2)Java代码实现—AlphaAnimation,ScaleAnimation,TranslateAnimation,RotateAnimation
例如:Java代码创建
//创建Alpha动画
Animation alpha=new AlphaAnimation(0.1f,1.0f);//透明度10%-100%
//设置动画时间为5秒
alpha.setDuration(5000);
//开始播放
img.startAnimation(alpha);
加载配置文件
Animation scale=AnimationUtils.loadAnimation(MainActivity.this,R.anim.scale_anim);
//开始播放
img.startAnimation(scale);
AlphaAnimation(透明度动画)
(1)fromAlpha:动画起始时透明度
(2)toAlpha:动画终止时的透明度
(3)duration:持续时间
注意:0.0表示完全透明,1.0表示完全不透明
xml的实现
<alpha android:duration="1000" android:fromAlpha="0.1" android:toAlpha="1.0" > </alpha>
在Activity的调用
loadAnimation = AnimationUtils.loadAnimation(this, R.anim.alpha); image.startAnimation(loadAnimation);
通过java代码实现透明度动画,可以创建android.view.animation.AlphaAnimation对象,设置起始透明度(fromAlpha)和结束透明度(toAlpha)。定义方法如下:
AlphaAnimation alphaAnimation=new AlphaAnimation(float fromAlpha,float toAlpha);
ScaleAnimation(缩放动画)
(1) fromXScale,toXScale分别是起始和结束时x坐标上的伸缩尺寸(2) fromYScale,toYScale分别是起始和结束时y坐标上的伸缩尺寸
(3) pivotX:表示沿X轴方向缩放的支点位置。如果该属性值为50%,则支点在沿X轴的中心位置
(4) pivotY:表示沿Y轴方向缩放的支点位置。如果该属性值为50%,则支点在沿Y轴的中心位置
注意:android的坐标系是从左上角开始,即左上角为原点(0,0),向右为x正方向(x增大),向下为y正方向(y增大)
xml的实现
<scale android:duration="2000" android:fillAfter="false" android:fromXScale="0.0" android:fromYScale="0.0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.0" android:toYScale="1.0" />
在Activity的调用
loadAnimation = AnimationUtils.loadAnimation(this, R.anim.scale); image.startAnimation(loadAnimation);
通过java代码实现透明度动画,可以创建android.view.animation.ScaleAnimation对象。定义方法如下:
ScaleAnimation scaleAnimation=new ScaleAnimation(float fromX,float toX,float fromY,float toY,float pivotX,float pivotY);
TranslateAnimation(位移动画)
(1)fromXDelta,fromYDelta分别是起始时X、Y的坐标(2)toXDelta,toYDelta分别是结束时X、Y的坐标
(3)interpolator表示动画渲染器。通过android:interpolator属性可以设置3个动画渲染器:accelerate_interpolator(动画加速器,使动画在开始的时候速度最慢,然后逐渐加速),decelerate_interpolator(动画减速器,使动画在开始的时候速度最快,然后逐渐减速.),accelerate_decelerate_interpolator(动画加速减速器,使动画在开始和结束的速度最慢,但在前半部分时开始加速,在后半部分时开始减速)
xml实现
<translate android:duration="1000" android:fromXDelta="10" android:fromYDelta="10" android:toXDelta="100" android:toYDelta="100" />
Activity的调用
loadAnimation = AnimationUtils.loadAnimation(this, R.anim.translate); image.startAnimation(loadAnimation);
通过java代码实现位移动画,可以创建android.view.animation.TranslateAnimation对象,设置起始位置和结束位置。定义方法如下:
TranslateAnimation translateAnimation=new TranslateAnimation(float fromXDelta,float toXDelta,float fromYDelta,float toYDelta);
RotateAnimation(旋转动画)
(1) fromDegrees 起始的角度(2) toDegrees 终止的角度
(3) pivotX、pivotY分别为旋转动画相对于x,y的坐标开始位置
(4) repeatCount设置旋转的次数,需要整数值。如果该值为0,表示不重复显示动画。如果属性值大于0,会再次显示该属性指定的次数。如果想要不停的旋转,可以将android:repeatCount属性值设为infinite或-1。该属性的默认值是0.
(5) repeatMode:设置重复的模式,默认值是restart。该属性只有当android:repeatCount设置成大于0的数或infinite时才起作用。android:repeatMode属性值除了可以是restart外,还可以设为reverse。
xml的调用
<rotate android:duration="1000" android:fromDegrees="0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toDegrees="-360" />
Activity的调用
loadAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate); image.startAnimation(loadAnimation);
通过java代码实现旋转动画,可以创建android.view.animation.RotateAnimation对象,设置旋转开始角度(fromDegrees)、旋转结束角度(toDegrees)、旋转支点横坐标(pivotX)、旋转支点纵坐标(pivotY)。定义方法如下:
RotateAnimation rotateAnimation=new RotateAnimation(float fromDegrees,float toDegrees,float pivotX,float pivotY);
多个动画是可以组合使用的
<scale android:duration="1000" android:fromXScale="0.1" android:fromYScale="0.1" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.0" android:toYScale="1.0" /> <alpha android:duration="1000" android:fromAlpha="0" android:toAlpha="1.0" />
Layout Animation(布局动画)
LayoutAnimation可以用来为ViewGroups添加动画,并按照预定的顺序,把一个动画(或者动画集合)应用到ViewGroup中的每一个View中。可以使用LayoutAnimationController来指定一个应用到ViewGroup中的每一个子View中的动画。
例如:在listview中添加布局动画,动态添加
listView=(ListView) findViewById(R.id.listView); List<String>list=new ArrayList<String>(); for(int i=0;i<20;i++) { list.add("动画"+i); } ArrayAdapter<String>adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list); listView.setAdapter(adapter); LayoutAnimationController lac=new LayoutAnimationController(AnimationUtils.loadAnimation(this, R.anim.zoom_in)); lac.setOrder(LayoutAnimationController.ORDER_NORMAL); listView.setLayoutAnimation(lac); listView.startLayoutAnimation();
FrameAnimation(逐帧动画)
使用animation-list标签来分组一个item标签集合,定义要显示的图片,指定显示它的时间(以毫秒为单位)。
其中<animation-list> 标签的一个关键属性是android:oneshot,如果该属性值为true,表示帧动画只运行一遍,也就是从第一个图像切换到最后一个图像后,动画就会停止。如果该属性值为false,表示帧动画循环播放。android:oneshot是可选属性,默认值是false。
<item>标签的android:drawable属性指定了动画中的静态图像资源ID。帧动画的播放顺序就是<item>标签的定义顺序。android:duration指定了每个图像的停留时间。
创建XML文件要放在/res/drawable/目录下,必须以animation-list为根元素。
AnimationDrawable类中与帧动画相关的方法:
(1)start:开始播放帧动画
(2)stop:停止播放帧动画
(3)setOneShot:设置是否只播放一遍帧动画(和<animation-list> 标签的中android:oneshot的属性一样)
(4)addFrame:向AnimationDrawable对象添加新的帧。该方法有两个参数,第一个参数是一个Drawable对象,表示添加的帧。该参数值可以是静态图像,也可以是另一个动画。第二个参数是表示新添加帧的停留时间。
(5)isOneShot:判断当前帧动画是否只播放一遍。该方法返回通过setOneShot方法或者android:oneshot设置的值
(6)isRunning:判断当前帧动画是否正在播放
(7)getNumberOfFrames:返回动画的帧数。也就是<animation-list> 标签的中<item>标签数
(8)getFrame:根据帧索引获得指定帧的Drawable对象,帧从0开始
(9)getDuration:获得指定帧的停留时间
xml实现
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true"> <item android:drawable="@drawable/one" android:duration="500"/> <item android:drawable="@drawable/two" android:duration="500"/> <item android:drawable="@drawable/three" android:duration="500"/> <item android:drawable="@drawable/four" android:duration="500"/> <item android:drawable="@drawable/five" android:duration="500"/> <item android:drawable="@drawable/six" android:duration="500"/> </animation-list>
编写完xml完之后,需要装载动画文件,并创建AnimationDrawable对象。AnimationDrawable是Drawable的子类,并在Drawable的基础上提供了控制动画的功能。
Activity实现
image.setImageResource(R.drawable.anim_list); AnimationDrawable anim = (AnimationDrawable) image.getDrawable(); anim.start();
废话不说,具体看下面的例子吧
https://github.com/kongkongdaren/AnimationDemo