- 浏览: 576272 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
hxlniada:
[color=darkred][/color][size=sm ...
利用Handler来更新android的UI -
jack_ye:
...
检测Android中触摸屏手势的动作与坐标 -
z278013421:
Android Services使用示例 -
东方vs不败:
写的不错,挺好的
利用Handler来更新android的UI -
liangxping:
就是双缓存机制而已。
Android中SurfaceView的使用示例
在做Android游戏MagicBubble开发的时候,在连通两个Bubbles的时候,Bubble会以水泡爆破的情形消失。为了实现这一效果,我查找了不少资料,希望能找到一些标准的实现方面,花了不少时间,发觉Android关于游戏开发的资料实在太少了,更不用说标准做法了,没办法,只能按照自己的思路来实现这一效果。
我的思路是这样的(仅供参考,希望有更好做法的朋友跟我们共享一下):在FrameLayout里面加入一ImageView,再定义一个爆炸的Animation,不需要的时候,ImageView就隐藏起来,需要的时候,就把ImageView移动到需要的地方,再StartAnimation,这样,就可以实现爆炸的效果。
下面是简化后的程序的代码,程序的效果如下:点中屏幕中任意地方,就在点击地方显示爆炸效果。
首先是Animation的定义,定义一个Frame Animation,依次播放5帧动画,每帧动画持续时间为50毫秒:
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true"> <item android:drawable="@drawable/explode1" android:duration="50" /> <item android:drawable="@drawable/explode2" android:duration="50" /> <item android:drawable="@drawable/explode3" android:duration="50" /> <item android:drawable="@drawable/explode4" android:duration="50" /> <item android:drawable="@drawable/explode5" android:duration="50" /> </animation-list>
接着是主程序代码:
package com.ray.bubble; import android.app.Activity; import android.content.Context; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.View.OnTouchListener; import android.widget.FrameLayout; import android.widget.ImageView; public class BubbleExplosion extends Activity { private FrameLayout fl; private ExplosionView exv1; private AnimationDrawable exa1; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //set full screen requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN); fl = new FrameLayout(this); fl.setBackgroundResource(R.drawable.bg); exv1 = new ExplosionView(this); exv1.setVisibility(View.INVISIBLE); exv1.setBackgroundResource(R.anim.explosion); exa1 = (AnimationDrawable)exv1.getBackground(); fl.addView(exv1); fl.setOnTouchListener(new LayoutListener()); setContentView(fl); } class ExplosionView extends ImageView{ public ExplosionView(Context context) { super(context); } //handle the location of the explosion public void setLocation(int top,int left){ this.setFrame(left, top, left+40, top+40); } } class LayoutListener implements OnTouchListener{ public boolean onTouch(View v, MotionEvent event) { //firstly, u have to stop the animation,if the animation //is starting ,u can not start it again! exv1.setVisibility(View.INVISIBLE); exa1.stop(); float x = event.getX(); float y = event.getY(); exv1.setLocation((int)y-20, (int)x-20); exv1.setVisibility(View.VISIBLE); exa1.start(); return false; } } }
配合Android的SurfaceView,Animation可以实现很好的过渡效果,SurfaceView的用法很简单,可参考:
http://rayleung.iteye.com/blog/420410
- BubbleExplosion.rar (163.5 KB)
- 下载次数: 2914
评论
30 楼
biner
2011-08-10
强大的楼主
29 楼
wangzx1983
2010-07-30
正好需要学习这方面的技术,把代码下下来看看,感谢几位老大的无私奉献。
28 楼
mncc
2010-03-22
那么问一下,如果屏幕上有多个地方需要上Animation,比如说飞行射击的时候,或者是多个物体碰撞的时候,这个时候应该怎么弄?View只能定义一个Animation啊?
27 楼
hone033
2010-02-09
这位老大写得不错,多谢楼主分享
26 楼
yicw
2010-01-08
在这里学到了不少知识,谢谢几位老大的无私奉献
25 楼
healthjava
2009-10-08
一直在考虑SurfaceView的动画显示问题。看了vlinux的代码豁然开朗。顶
24 楼
lordhong
2009-09-21
学习一下... 希望有一天开发出自己心仪的游戏
23 楼
raymondlueng
2009-09-21
vlinux 写道
回来的路上就在想,是不是对SurfaceView的理解严重有误呢。一下飞机马上就开始实现设想,终于找到解决办法了。
使用SurfaceView就命中注定了一切从头开始自己动手创建、动手释放、动手画,不应该再抱有类似AnimationDrawable一样用法的幻想。
写了一个DEMO,Kuba这类的游戏要做也只是时间问题。
作为绘画核心的DrawRunning线程
使用SurfaceView就命中注定了一切从头开始自己动手创建、动手释放、动手画,不应该再抱有类似AnimationDrawable一样用法的幻想。
写了一个DEMO,Kuba这类的游戏要做也只是时间问题。
作为绘画核心的DrawRunning线程
/** * 绘画线程 * * @author vlinux * */ public class DrawRunning implements Runnable { private List<AnimationDraw> animationDraws;//所有需要画动画的集合 private List<AnimationDraw> buffers;//缓存前台传入需要展示的动画 private SurfaceHolder surfaceHolder; private boolean running; public DrawRunning(SurfaceHolder surfaceHolder) { this.surfaceHolder = surfaceHolder; animationDraws = new ArrayList<AnimationDraw>(); buffers = new ArrayList<AnimationDraw>(); running = true; } @Override public void run() { // TODO Auto-generated method stub while (running) { synchronized (surfaceHolder) { Canvas canvas = null; try { canvas = surfaceHolder.lockCanvas(null); doDraw(canvas); } finally { if (null != canvas) { surfaceHolder.unlockCanvasAndPost(canvas); }// if }// try }// syn }// while } private void doDraw(Canvas canvas) { synchronized(this) { //检查缓存中是否有需要加入的动画 if( !buffers.isEmpty() ) { animationDraws.addAll(buffers);//加入animationDraws buffers.clear();//清空缓存 }//if }//syn if( animationDraws.isEmpty() ) { return;//如果animationDraws里面是空的那就不用画了 }//if //---这里开始绘画 Iterator<AnimationDraw> bombIt = animationDraws.iterator(); while (bombIt.hasNext()) { AnimationDraw bomb = bombIt.next(); Bitmap nextFrame = bomb.nextFrame(); if (null == nextFrame) { //下一Frame为null,说明动画序列已经结束 //该动画已经完成,从动画集合中删除 bombIt.remove(); continue;//while }// if canvas.drawBitmap(nextFrame, bomb.getX(), bomb.getY(), null); }// while } public void addAnimationDraw(AnimationDraw bomb) { synchronized(this) { //尽量减少这个的同步响应时间,因为这个方法是前台响应的 //多0.1秒都会直接反应到用户感知 buffers.add(bomb);//将需要显示动画的内容加入到缓存 }//syn } public void stopDrawing() { running = false; } }
这段代码写得好,很好的思路,非常感谢!
22 楼
vlinux
2009-09-20
回来的路上就在想,是不是对SurfaceView的理解严重有误呢。一下飞机马上就开始实现设想,终于找到解决办法了。
使用SurfaceView就命中注定了一切从头开始自己动手创建、动手释放、动手画,不应该再抱有类似AnimationDrawable一样用法的幻想。
写了一个DEMO,Kuba这类的游戏要做也只是时间问题。
作为绘画核心的DrawRunning线程
使用SurfaceView就命中注定了一切从头开始自己动手创建、动手释放、动手画,不应该再抱有类似AnimationDrawable一样用法的幻想。
写了一个DEMO,Kuba这类的游戏要做也只是时间问题。
作为绘画核心的DrawRunning线程
/** * 绘画线程 * * @author vlinux * */ public class DrawRunning implements Runnable { private List<AnimationDraw> animationDraws;//所有需要画动画的集合 private List<AnimationDraw> buffers;//缓存前台传入需要展示的动画 private SurfaceHolder surfaceHolder; private boolean running; public DrawRunning(SurfaceHolder surfaceHolder) { this.surfaceHolder = surfaceHolder; animationDraws = new ArrayList<AnimationDraw>(); buffers = new ArrayList<AnimationDraw>(); running = true; } @Override public void run() { // TODO Auto-generated method stub while (running) { synchronized (surfaceHolder) { Canvas canvas = null; try { canvas = surfaceHolder.lockCanvas(null); doDraw(canvas); } finally { if (null != canvas) { surfaceHolder.unlockCanvasAndPost(canvas); }// if }// try }// syn }// while } private void doDraw(Canvas canvas) { synchronized(this) { //检查缓存中是否有需要加入的动画 if( !buffers.isEmpty() ) { animationDraws.addAll(buffers);//加入animationDraws buffers.clear();//清空缓存 }//if }//syn if( animationDraws.isEmpty() ) { return;//如果animationDraws里面是空的那就不用画了 }//if //---这里开始绘画 Iterator<AnimationDraw> bombIt = animationDraws.iterator(); while (bombIt.hasNext()) { AnimationDraw bomb = bombIt.next(); Bitmap nextFrame = bomb.nextFrame(); if (null == nextFrame) { //下一Frame为null,说明动画序列已经结束 //该动画已经完成,从动画集合中删除 bombIt.remove(); continue;//while }// if canvas.drawBitmap(nextFrame, bomb.getX(), bomb.getY(), null); }// while } public void addAnimationDraw(AnimationDraw bomb) { synchronized(this) { //尽量减少这个的同步响应时间,因为这个方法是前台响应的 //多0.1秒都会直接反应到用户感知 buffers.add(bomb);//将需要显示动画的内容加入到缓存 }//syn } public void stopDrawing() { running = false; } }
21 楼
raymondlueng
2009-09-15
vlinux 写道
是,那个代码我干掉了,我想完善点再丢上来的。总觉得真相就在手边了。
好,一起加油!
20 楼
vlinux
2009-09-15
是,那个代码我干掉了,我想完善点再丢上来的。总觉得真相就在手边了。
19 楼
raymondlueng
2009-09-15
vlinux 写道
不知道你是否有玩过一款叫做 “Buka" 的游戏,你觉得密集touch所产生那群蓝色光晕是多个View的效果么?
多个隐藏View,恩.你是想要做一个隐藏的View池?总觉得这不是一个最好的解决办法的说。
多个隐藏View,恩.你是想要做一个隐藏的View池?总觉得这不是一个最好的解决办法的说。
玩过Buka,还挺喜欢的,我也的确认为隐藏View做不出Buka这样的游戏,我认为隐藏VIew是对于一些比较简单动画的 游戏,是个方便高效的方法而已,我看了你的代码,代码并不是你说的用SurfaceVIew来实现动画啊!
18 楼
vlinux
2009-09-15
不知道你是否有玩过一款叫做 “Buka" 的游戏,你觉得密集touch所产生那群蓝色光晕是多个View的效果么?
多个隐藏View,恩.你是想要做一个隐藏的View池?总觉得这不是一个最好的解决办法的说。
多个隐藏View,恩.你是想要做一个隐藏的View池?总觉得这不是一个最好的解决办法的说。
17 楼
raymondlueng
2009-09-15
vlinux 写道
raymondlueng 写道
vlinux 写道
这个方法可行性不高,因为同一时间只有一个动画存在,如果是要多个动画出现,就挂了
使用过多个动画效果同时显示,没性能问题,请问您有没更好的方法,分享一下啦!
多个动画效果同时显示,根据你的例子来看,一个动画必须绑定一个View吧。但是爆炸是随机发生的事件。比如说我touch一下屏幕就要有一个爆炸动画出现,如果我在短时间是大量的touch那一个View的劣势就显示出来了。
如果你是打算用动态添加View,那肯定要有性能代价。
其实也不用的,我这个做法是从flash游戏的开发受启发的,你可以同时隐藏多个view,需要的时候就把其显现出来,大量的touch毕竟也是有些的,View的复用也是蛮高的!
16 楼
raymondlueng
2009-09-15
vlinux 写道
初涉这块领地,也正在努力探索。
分两个思路来讨论一下
1.改进你的方法。
你的的方法是利用Android自带的Frame-By-Frame例子的,缺点就是Android目前依靠配置无法从一张动画序列图中截取部分来显示动画。所以这样就造成了必须准备一张张单独的图片,这对一个游戏拥有大量动作且Android的res目录不支持子目录的情况下来看是不大雅观的。
我用AnimationDrawable稍做了一些改进。
2.直接用SurfaceView开线程画。用线程+SurfaceView无疑是最好的办法了。不过我目前卡死在这里,因为每帧画出的图案就永久生效了。不像之前的Animation是可以重叠,当动画消失之后还原背景。非常令我苦闷,不知道你有没有在SurfaceView做动画的好办法。
分两个思路来讨论一下
1.改进你的方法。
你的的方法是利用Android自带的Frame-By-Frame例子的,缺点就是Android目前依靠配置无法从一张动画序列图中截取部分来显示动画。所以这样就造成了必须准备一张张单独的图片,这对一个游戏拥有大量动作且Android的res目录不支持子目录的情况下来看是不大雅观的。
我用AnimationDrawable稍做了一些改进。
2.直接用SurfaceView开线程画。用线程+SurfaceView无疑是最好的办法了。不过我目前卡死在这里,因为每帧画出的图案就永久生效了。不像之前的Animation是可以重叠,当动画消失之后还原背景。非常令我苦闷,不知道你有没有在SurfaceView做动画的好办法。
我一开始做游戏动画的时候就是用surfaceview+线程来实现的,正如你所说的,动画消失后还要还原背景,在画面上画任何一点东西,都要导致整个画面重画,如果画动画的时候,有用户交换(比如说拖动某个物体,会导致画面闪烁非常严重),似乎这个办法也不是解决之道
15 楼
vlinux
2009-09-15
raymondlueng 写道
vlinux 写道
这个方法可行性不高,因为同一时间只有一个动画存在,如果是要多个动画出现,就挂了
使用过多个动画效果同时显示,没性能问题,请问您有没更好的方法,分享一下啦!
多个动画效果同时显示,根据你的例子来看,一个动画必须绑定一个View吧。但是爆炸是随机发生的事件。比如说我touch一下屏幕就要有一个爆炸动画出现,如果我在短时间是大量的touch那一个View的劣势就显示出来了。
如果你是打算用动态添加View,那肯定要有性能代价。
14 楼
vlinux
2009-09-15
初涉这块领地,也正在努力探索。
分两个思路来讨论一下
1.改进你的方法。
你的的方法是利用Android自带的Frame-By-Frame例子的,缺点就是Android目前依靠配置无法从一张动画序列图中截取部分来显示动画。所以这样就造成了必须准备一张张单独的图片,这对一个游戏拥有大量动作且Android的res目录不支持子目录的情况下来看是不大雅观的。
我用AnimationDrawable稍做了一些改进。
2.直接用SurfaceView开线程画。用线程+SurfaceView无疑是最好的办法了。不过我目前卡死在这里,因为每帧画出的图案就永久生效了。不像之前的Animation是可以重叠,当动画消失之后还原背景。非常令我苦闷,不知道你有没有在SurfaceView做动画的好办法。
分两个思路来讨论一下
1.改进你的方法。
你的的方法是利用Android自带的Frame-By-Frame例子的,缺点就是Android目前依靠配置无法从一张动画序列图中截取部分来显示动画。所以这样就造成了必须准备一张张单独的图片,这对一个游戏拥有大量动作且Android的res目录不支持子目录的情况下来看是不大雅观的。
我用AnimationDrawable稍做了一些改进。
2.直接用SurfaceView开线程画。用线程+SurfaceView无疑是最好的办法了。不过我目前卡死在这里,因为每帧画出的图案就永久生效了。不像之前的Animation是可以重叠,当动画消失之后还原背景。非常令我苦闷,不知道你有没有在SurfaceView做动画的好办法。
13 楼
raymondlueng
2009-09-14
vlinux 写道
这个方法可行性不高,因为同一时间只有一个动画存在,如果是要多个动画出现,就挂了
使用过多个动画效果同时显示,没性能问题,请问您有没更好的方法,分享一下啦!
12 楼
vlinux
2009-09-14
这个方法可行性不高,因为同一时间只有一个动画存在,如果是要多个动画出现,就挂了
11 楼
fkpwolf
2009-09-06
爆炸这个好像是游戏里面挺难解决的一个问题,如果要真是模拟爆炸的话,大多是预先设好了所有爆炸的画面,当然这个画面是一样的
发表评论
-
类似Chome的翻转效果
2012-09-18 23:14 2344简单的demo,屏幕上下滑动翻转View,类似Android ... -
3D编程基础数学之旋转及在Android中的应用
2012-02-10 00:11 0最近因为兴趣,看了一些3D编程的书,有种感觉就是写这些书的作者 ... -
Android中屏幕Density对BitmapDrawable的影响
2011-07-08 21:44 7843很早之前写的文章了,发在这里记录一下。 在之前的 ... -
Android程序与Javascript的交换
2010-04-16 21:40 0hello! -
Android Services使用示例
2010-01-12 16:50 14042Android开发中,当需要创建在后台运行的程序的时候,就要 ... -
Android游戏开发之服务器端
2010-01-09 16:38 6668首先我不知道这篇文章发到Android开发板块是否适合的,因为 ... -
Android ListView常用用法
2009-12-03 20:56 36598ListView是比较常用的控件,但一直都觉得创建ListVi ... -
Android View添加 Listener 小技巧示例
2009-12-02 15:35 9788在开发中为控件添加Listener是非常常见的工作,最简单的添 ... -
Android Gesture 手势识别使用实例
2009-10-20 11:56 10151很高兴能在Android1.6的sdk看到手势识别这一 ... -
Android第二个游戏 DragonFeed(勇者喂恶龙)
2009-10-12 17:57 7962这是参加学校一个小比赛的参赛游戏,之前一直在忙 认证考试和项目 ... -
Android 震动示例--心跳效果
2009-10-02 23:58 7672正在开发第二个游戏,计时就要结束的时候,为了营造紧张的气氛, ... -
Android adb的使用略解
2009-09-30 16:08 40217安卓网的一个帖子,写得不错,记下来 ADB全称Android ... -
Android游戏开发之连连看算法
2009-09-29 00:36 10347因为有朋友在站内信中问到连连看的具体算法,所以我就把算法pos ... -
android游戏开发之选关画面
2009-09-21 15:44 3974在游戏开发中,往往要提供选关的页面,选择关卡可以简单地使用li ... -
Android重力感应Demo
2009-09-11 23:33 13988android中的很多游戏的游戏都使用了重力感应的技术,但其a ... -
Android 的第一个游戏
2009-08-18 08:48 7871学了android1个多月,做了一款连连看游戏,上了andro ... -
Android canvas的save()和restore()用法
2009-08-05 12:21 19829在读Android SDK里面的samples里面游戏的时候, ... -
Android 2d物理引擎Box2d的使用示例
2009-08-04 09:06 14196Box2d是一个很出名的2d物理引擎,大家可以google之。 ... -
利用Handler更新Android UI的另一种方法
2009-07-29 11:28 11845文字程序很简单,一个View,一个Activity,利用han ... -
android布局学习利器-Hierarchy Viewer
2009-07-27 18:17 8068Hierarchy Viewer 帮你分析应用程序UI布局 ...
相关推荐
android游戏开发之旅 android游戏开发之旅
http://video.sina.com.cn/playlist/4003320-1320045357-1.html#33844107?Android游戏及应用开发之2? http://video.sina.com.cn/playlist/4003320-1320045357-1.html#33845175?Android游戏及应用开发之3? ...
雨松MOMO带你做游戏 Android游戏开发之音乐与音效的处理太鼓达人游戏原理 欢迎大家下载阅读
本科毕业设计论文,android解密游戏开发,从 1 绪论 1.1 课题的背景及意义1.2 研究现状1.3 论文主要工作1.4 论文结构安排 2 Android平台研究2.1 Android特征 2.2 Android应用的构成2.2.1 活动2.2.2 意图接收器2.2.3...
Android粒子爆炸特效。包含四种效果:向下破碎、被风吹走、上升破碎、分裂。
雨松MOMO带你做游戏 Android游戏开发之小球重力感应源码 欢迎大家下载阅读。
Android已经成为很多手机厂家的首选操作平台,Android的Application也就越来越火爆了,这是Android游戏开发方面的一些基础知识,希望对大家有所帮助
雨松MOMO带你做游戏 Android 游戏开发之主角的移动与地图的平滑滚动源码 欢迎大家下载阅读
雨松MOMO带你做游戏 Android 游戏开发之Tween动画的实现 欢迎大家下载阅读 哇咔咔~~~
Android 3D游戏开发,(含代码和游戏实例)
5.1 Android游戏开发框架 5.1.1 View类开发框架 5.1.2 SurfaceView类开发框架 5.2 Graphics类开发 5.5.1 Paint和Color类介绍 5.2.2 Canvas类介绍 5.2.3 几何图形绘制 5.2.4 字符串绘制 5.2.5 图像绘制 5.2.6 图像...
android android游戏开发
android游戏开发实战宝典与3D游戏开发教程.7z 免费下载
ANDROID+游戏开发大全 ANDROID+游戏开发大全
第2篇为应用开发篇,通过实例介绍了Android UI布局、Android人机界面、手机硬件设备的使用、Android本地存储系统、Android中的数据库、多线程设计、Android传感器、Android游戏开发基础、Android与Internet,以及...
Android游戏开发大全.pdf
《Android3D游戏开发技术详解与典型案例》既介绍了Android 3D游戏开发中必知必会的基础知识,同时通过7个真实案例向读者介绍Android 3D游戏的完整开发步骤,希望通过本书能够使读者尽快掌握Android 3D游戏开发的...
雨松MOMO带你做游戏Android游戏开发之摄像头的原理以及更新源码 欢迎大家家下载阅读