这几天开着代理研究android(主要是长期以来 developer.android.com 被墙撞……),总算初步掌握了android的图形处理方式,准备在Blog上写一些经验性的总结。
一、Android Virtual Device仿真界面对应快捷
二、要想在View中绘制图形,至少需要用到以下三者
1、Bitmap
Android中使用Bitmap承载图像资源,其默认支持4种图像格式(调用方式,Bitmap.Config.XXXX),分别为ALPHA8、RGB565、ARGB4444、ARGB8888,单就显示效果而言以ARGB8888效果最佳,ALPHA8效果最差,当然占用资源与之相反。
不过Bitmap本身的运算量非常小,其具体操作大量依赖于native,如下所示:
2、Canvas
Android中使用Canvas对应标准Java应用中的Graphics,其具体操作与Graphics类似,但实际功能却较Graphics为少,需要同Paint配合使用。
与Bitmap近似,Canvas主要实现依赖于OpenGL ES,其本身的运算量非常之小,Canvas本地接口如下所示:
3、Paint
用以设定图像的绘制方式,可以同Canvas一道看作Graphics功能的拆分,只有当Canvas与Paint共同使用时,才可能实现Graphics的大部分功能(并非全部)。
Paint依旧大量依赖于本地接口,具体函数如下:
Android绘图的基本示例: canvas.drawBitmap(bitmap, 0, 0, paint) // canvas代表画布 bitmap作为图像资源 paint决定绘图方式
3、Android的窗口构成,即Activity + View = Form。
Android以Activity类作为窗体容器,以View(或SurfaceView等)绘制所有的按钮及界面,以AndroidManifest.xml配置相关的初始化资源,Android图形应用的一切通过它们衍生开来。
由于Android的线程安全机制并不等同于标准Java应用,invalidate()不能循环绘制View(偶实际试验了,丢到Thread里就死|||),所以View的图形绘制需要通过Handler处理,它将在函数内实现了一个类似于递归的循环线程,结构如下(具体实现请见Android提供的snake示例):
sendMessageDelayed->handleMessage->handleMessage 再次呼叫 sendMessageDelayed->handleMessage 被呼叫->循环
这种线程结构虽然简单且高效,但是很多常见的线程手段却无法在其中实现,因此只适合简单的应用(比如计时器,定时绘图等),复杂的线程结构则需要SurfaceView。
SurfaceView是View的子类,它继承自View。与只能使用Handler方式循环绘制图像的View不同,SurfaceView通过调用一对lockCanvas()和unlockCanvasAndPost()进行绘图,具体实现可见Google提供的LunarLander示例。
根据鄙人实测,View的Handler方式较SurfaceView的lockCanvas()与unlockCanvasAndPost()方式FPS为高,惟独可控性太差,本人推荐在简单应用使用View,在复杂应用使用SurfaceView。
另外xml中屏幕纵、横核定项如下:
screenOrientation="portrait" 纵向屏幕
screenOrientation="landscape" 横向屏幕
与之对应的代码设定方式是在Activity中setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)与setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
PS:Android中所有图形设备都基于OpenGL ES,默认存在Z-Buffer,绝对不会出现Java桌面应用中的闪烁问题,算是一项进步。
下面我给出一个简单的Android绘图示例,也是LGame-Simple在Android中的最初原型代码,我们可以看到Android与标准Java桌面应用的差异实际上是极为细微的。
源码下载地址:http://code.google.com/p/loon-simple/downloads/list
PS:此用例中所有[LA]开头Java文件为Android下专用,否则皆为LGame-Simple通用。
LAGameView.java(对应LGame-Simple中的GameView)
LAScreen.java(对应LGame-Simple中的Screen)
Main.java(启动类)
ScreenTest.java(测试类)
横屏效果:
纵屏效果:
源码下载地址:http://code.google.com/p/loon-simple/downloads/list
可以看到,此示例虽为LGame-Simple的简写,但最基础的功能已经实现,我们仅需设定一个继承自LAScreen的游戏屏幕,就可以同LGame-Simple中一样,分模块开发游戏,并且随意更换当前游戏模块及更替按键设定了。
实际上如果您愿意,即使偶不出Android版的LGame-Simple,将其自行移植到Android上的难度也绝对比您所想象的要小得多(当然,Android版偶是肯定会出的^.^)
————————————天下大势,分久必合,合久必分—————————————
事实上Android与标准Java应用近乎一致,唯独在多线程方面有些“恶心”,比如View中的invalidate()函数只能在Handler中做类似递归的handleMessage与sleep相互调用,Thread.currentThread().getContextClassLoader()也无法获得jar内部资源,感觉上就像Google要强制你学习它那套samples应用,而不能更改一样。
把LGame-Simple移植到Android上比我想象的要简单,刚刚又试验了一下,除了有关图形接口与线程的部分,其余直接copy过来就可以用,甚至连代码都不必改,所以12月出LGame-Simple的Android版肯定没问题。(事实上,如果偶现在开始什么都不干只写这个的话,大约5天左右就可以搞定……可惜不现实……)
另外偶可能尝试开发一个函数移植器,看看能不能做到PC与Android上的LGame-Simple游戏间自动代码转换,目前看来可行性蛮高的。
分享到:
相关推荐
通过对收集整理的360起零打碎敲事故案例的统计分析,为进一步吸取事故教训,举一反三,做好事故预想,变被动为主动,对其发生的原因进行了深入分析,提出了针对性的防范措施,在增强员工安全意识、规范作业行为、提升安全...
供应科杜绝零打碎敲事故大讨论纪要.docx
关于开展杜绝零打碎敲事故大讨论活动总结.docx
关于开展杜绝零打碎敲事故大讨论活动心得.docx
关于开展杜绝零打碎敲事故大讨论心得体会.docx
城郊煤矿掘进系统关于杜绝零打碎敲事故大讨论会议纪要.docx
那时候我们还在 Sun 公司,尝试用一些零打碎敲的特定问题解决方案来扩展语言,如 for-eac 环,枚举,自动装包,去简化程序开发的时候,马丁则继续着他在更强大的正交语言原语方面 作以帮助程序员用库来提供解决方案...
由于安全帽事故是零打碎敲的小事故,不容易引起人们的关注,煤矿企业对此存在麻痹松懈意识,因安全帽的质量问题及使用不当造成的事故时有发生,因此有必要对安全帽事故发生的原因进行系统分析并提出预防措施。...
但日常发生的顶板、机电、运输、放炮等零打碎敲事故与瓦斯爆炸事故有着密切的联系。从不同角度、不同层面剖析了唐山地区近10 a主要生产矿井全部生产死亡事故特点,探讨了员工工龄、年龄和素质等结构特点在瓦斯爆炸...