本文实例讲述了android编程根据系列图片绘制动画的方法。分享给大家供大家参考,具体如下:
一、采用系统提供的animation类,用自带的方法
其中的animation.xml文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
<animation-list xmlns:android= "http://schemas.android.com/apk/res/android" android:oneshot= "false" > <item android:drawable= "@drawable/a" android:duration= "100" /> <item android:drawable= "@drawable/b" android:duration= "100" /> <item android:drawable= "@drawable/c" android:duration= "100" /> <item android:drawable= "@drawable/d" android:duration= "100" /> <item android:drawable= "@drawable/e" android:duration= "100" /> <item android:drawable= "@drawable/f" android:duration= "100" /> <item android:drawable= "@drawable/g" android:duration= "100" /> <item android:drawable= "@drawable/h" android:duration= "100" /> <item android:drawable= "@drawable/i" android:duration= "100" /> <item android:drawable= "@drawable/j" android:duration= "100" /> </animation-list> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
animationdrawable animationdrawable = null ; /**拿到imageview对象**/ imageview = (imageview)findviewbyid(r.id.imageview); /**通过imageview对象拿到背景显示的animationdrawable**/ animationdrawable = (animationdrawable) imageview.getbackground(); /**开始播放动画**/ button0 = (button)findviewbyid(r.id.button0); button0.setonclicklistener( new onclicklistener() { @override public void onclick(view arg0) { /**播放动画**/ if (!animationdrawable.isrunning()) { animationdrawable.start(); } } }); |
其中://设置单次播放 animationdrawable.setoneshot(true);
二、提供了很多帧动画的图片,利用android绘图,可以绘制出人物走动的动画。
如上图,这种情况下,可以按照如下步骤,绘制动画:
1、 根据人物上下左右行走,可以分为四段动画,可以定义一个长度为4的动画数组;
2、 根据键盘上下左右键事件分别触发不同的动画。
主要绘制的语句如下:
1
2
3
4
|
mheroanim[anim_down] = new animation(context, new int []{r.drawable.hero_down_a,r.drawable.hero_down_b,r.drawable.hero_down_c,r.drawable.hero_down_d}, true ); mheroanim[anim_left] = new animation(context, new int []{r.drawable.hero_left_a,r.drawable.hero_left_b,r.drawable.hero_left_c,r.drawable.hero_left_d}, true ); mheroanim[anim_right]= new animation(context, new int []{r.drawable.hero_right_a,r.drawable.hero_right_b,r.drawable.hero_right_c,r.drawable.hero_right_d}, true ); mheroanim[anim_up] = new animation(context, new int []{r.drawable.hero_up_a,r.drawable.hero_up_b,r.drawable.hero_up_c,r.drawable.hero_up_d}, true ); |
三、只提供一张人物图片,就要采用程序来切割该图片,得到动画所需要的帧图像,
如上图,这种情况下,可以按照如下步骤,绘制动画:
1、通过该图片的宽度和高度,和定义的tile的宽度和高度,可以切割出12张所需要的帧图像;
2、根据人物上下左右行走,可以分为四段动画,可以定义一个长度为4的动画数组;
3、 根据键盘上下左右键事件分别触发不同的动画;
切割图片,以及绘制动画的主要代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//利用程序来切割图片 bitmap testmap = readbitmap(context,r.drawable.enemy); bitmap [][]bitmap = new bitmap[anim_count][anim_count]; int tilewidth = testmap.getwidth() / anim_count; int tileheight = testmap.getheight() / anim_count; int i = 0 ,x = 0 ,y = 0 ; for (i = 0 ; i < anim_count; i++) { y = 0 ; bitmap[anim_down][i] = bitmapclipbitmap(testmap,x,y,tilewidth,tileheight); y+=tileheight; bitmap[anim_left][i] = bitmapclipbitmap(testmap,x,y,tilewidth,tileheight); y+=tileheight; bitmap[anim_right][i] = bitmapclipbitmap(testmap,x,y,tilewidth,tileheight); y+=tileheight; bitmap[anim_up][i] = bitmapclipbitmap(testmap,x,y,tilewidth,tileheight); x+= tilewidth; } mtestanim[anim_down] = new animation(context,bitmap[anim_down], true ); mtestanim[anim_left] = new animation(context,bitmap[anim_left], true ); mtestanim[anim_right]= new animation(context,bitmap[anim_right], true ); mtestanim[anim_up] = new animation(context,bitmap[anim_up], true ); |
注意:以上后面两种方式分别采用了不同的绘制方法
第一种的绘制构造方法为:animation(context context, int [] framebitmapid, boolean isloop);
第二种的绘制构造方法为:animation(context context, bitmap [] framebitmap, boolean isloop);
有了这些准备条件后,我们可以开始真正的绘制:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public void drawanimation(canvas canvas, paint paint, int x, int y) { //如果没有播放结束则继续播放 if (!misend) { canvas.drawbitmap(mframebitmap[mplayid], x, y, paint); long time = system.currenttimemillis(); if (time - mlastplaytime > anim_time) { mplayid++; mlastplaytime = time; if (mplayid >= mframecount) { //标志动画播放结束 misend = true ; if (misloop) { //设置循环播放 misend = false ; mplayid = 0 ; } } } } } |
这里采用了两个标志位来判断动画的状态,misend判断动画是否播放,true结束播放,false为播放动画;misloop判断动画是否循环,true为循环,false为不循环;当然,动画循环的时候,动画肯定是播放的,于是misloop为true,则misend为false,由于每一组动画都为四张图片,所以mplayid最多为4,当人物一组动作也就是一个动画完成后,表示4张图片都绘制了一遍,则要讲mplayid置为0,表示重新开始需要绘制四张图片代表一个动画。
我们在主类中如何通过按键来触发动画呢?需要通过实现ondraw()方法,并且不断的重绘,主要代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
protected void ondraw(canvas canvas) { canvas.drawbitmap(mmapimage, 0 , 0 , mpaint); canvas.save(); canvas.cliprect( 0 , 0 , 320 , 30 ); mpaint.setcolor(color.white); canvas.drawrect( 0 , 0 , 480 , 30 , mpaint); mpaint.setcolor(color.red); canvas.restore(); /**根据按键更新显示动画**/ if (mallkeydown) { if (miskeydown) { manimationstate = anim_down; canvas.drawtext( "按下下键,开始播放向下动画开始" , 0 , 20 , mpaint); } else if (miskeyleft) { manimationstate = anim_left; canvas.drawtext( "按下左键,开始播放向左动画开始" , 0 , 20 , mpaint); } else if (miskeyright) { manimationstate = anim_right; canvas.drawtext( "按下右键,开始播放向右动画开始" , 0 , 20 , mpaint); } else if (miskeyup) { manimationstate = anim_up; canvas.drawtext( "按下上键,开始播放向上动画开始" , 0 , 20 , mpaint); } /**绘制主角动画**/ mheroanim[manimationstate].drawanimation(canvas, mpaint, 20 , 100 ); mtestanim[manimationstate].drawanimation(canvas, mpaint, 100 , 100 ); } else { /**按键抬起后人物停止动画**/ mheroanim[manimationstate].drawframe(canvas, mpaint, 20 , 100 , 0 ); mtestanim[manimationstate].drawframe(canvas, mpaint, 100 , 100 , 0 ); canvas.drawtext( "按键已经抬起动画停止" , 0 , 20 , mpaint); } super .ondraw(canvas); invalidate(); } |
这样,我们的动画绘制时时刻刻都在进行着。
我们可以通过控制上下左右按键,来控制标志:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public void setkeystate( int keycode, boolean state) { switch (keycode) { case keyevent.keycode_dpad_down: miskeydown = state; break ; case keyevent.keycode_dpad_up: miskeyup = state; break ; case keyevent.keycode_dpad_left: miskeyleft = state; break ; case keyevent.keycode_dpad_right: miskeyright = state; break ; } mallkeydown = state; } |
希望本文所述对大家android程序设计有所帮助。