引言:
Android提供的动画有两种分别为TweenAnimation和FrameAnimation。Tween动画主要实现了渐变,缩放,平移以及旋转的效果。
Frame动画即逐帧动画,就是将动画分解成关键帧图片连续形成动画,或者说在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。本片博客讲述的就是逐帧动画。逐帧动画的优势在于具有较强的灵活性,几乎可以完成任何想要的动画效果,但是也是复杂的效果对为文件的压力越大。
逐帧动画的使用依赖于AnimationDrawable类的支持。它位于"android.graphics.drawable.AnimationDrawable"包下,是Drawable的间接子类。它主要用来创建一个逐帧动画,并且可以对帧进行拉伸,把它设置为View的背景即可使用AnimationDrawable.start()方法播放。由于逐帧动画是一帧帧的播放图片所以需要添加帧图片,Android提供了两种添加的方式,java代码创建以及xml文件引用资源文件。
1,采用xml的方式设置动画资源
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android= "http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/loading_1" android:duration="300"/> <item android:drawable="@drawable/loading_2" android:duration="300"/> </animation-list>每一个item就是一帧图片,duration为每一帧持续的时间。在Java代码中:
loadingImg.setBackgroundResource(R.anim.animation_list); AnimationDrawable anim = (AnimationDrawable)loadingImg.getBackground(); anim.start();将配置文件设置为想要的View的背景,获得AnimationDrawable对象调用他的start()方法启动动画。通过stop()方法来终止动画。
2,使用java设置动画资源
其实和使用xml的方式一样,没有什么太大的区别。
AnimationDrawable frameAnim =new AnimationDrawable(); frameAnim.addFrame(getResources().getDrawable(R.drawable.loading_1), 300); frameAnim.addFrame(getResources().getDrawable(R.drawable.loading_2), 300); frameAnim.setOneShot(false); loadingImg.setBackgroundDrawable(frameAnim); frameAnim.start();setOneShot()方法用来设计动画是否循环播放。false为循环播放。
3,下面是AnimationDrawable的常用的方法
void start():开始播放逐帧动画。
void stop():停止播放逐帧动画。
void addFrame(Drawable frame,int duration):为AnimationDrawable添加一帧,并设置持续时间。
int getDuration(int i):得到指定index的帧的持续时间。
Drawable getFrame(int index):得到指定index的帧Drawable。
int getNumberOfFrames():得到当前AnimationDrawable的所有帧数量。
boolean isOneShot():当前AnimationDrawable是否执行一次,返回true执行一次,false循环播放。
boolean isRunning():当前AnimationDrawable是否正在播放。
void setOneShot(boolean oneShot):设置AnimationDrawable是否执行一次,true执行一次,false循环播放