转眼间就2015年了,时间过得真快,基本在找资料的时候很多都在CSDN的博客里找到。现在,也自己开始写了,希望自己能在这条路上坚持下去吧。
一开始是看着老师的视频一点点打的,整个看完了以后,整理了一下思路,重新自己打了一遍,也是遇到了很多的问题,看似是理解了,但是实际操作起来还是有很多的问题,最后还是完成了。老师写的只算是 个半成品,还有许多地方可以完善,这篇文章先写下来,趁热打铁嘛,这样自己以后也方便温习。然后一些知识点,都是我学到的,都加了淡色背景,可能排版还是有点糟,就先这样吧。
首先,先把工程下的几个包列一下
XXX为工程包名
XXX.entity 这个包用来放所有的实体集合
XXX.global 这个包用来放所有的静态全局变量
XXX.model这个包用来放父类(用于实体的extends)和一些接口
XXX.tools 这个包用来放图像处理类的工具
XXX.view 这个包用来放视图类的文件
先在.view包下新建GameView,让其extends SurfaceView,实现接口SurfaceHolder.Callbak和Runnable
关于SurfaceView
一、什么是SurfaceView?
可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图容器。它的特性是:可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。
二、SurfaceView和其他View的区别?
SurfaceView和View最本质的区别在于,surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。可以理解为Surfaceview的更新不需要在主线程中进行,这样就可以避免主线程来做大量的界面更新操作,引起ANR(主线程的界面更新的消息队列当中存在大量的更新界面请求)。
三、SurfaceView的使用
首先继承SurfaceView并实现SurfaceHolder.Callback接口使用接口的原因:因为使用SurfaceView 有一个原则,所有的绘图工作必须得在Surface 被创建之后才能开始,而在Surface 被销毁之前必须结束。所以Callback 中的surfaceCreated 和surfaceDestroyed 就成了绘图处理代码的边界。
上面提到了SurfaceHolder这个类
关于SurfaceHolder
可以把SurfaceHolder当成surface的控制器,用来操纵surface。处理它的Canvas上画的效果和动画,控制表面,大小,像素等。几个需要注意的方法:
(1)、abstract void addCallback(SurfaceHolder.Callback callback);
// 给SurfaceView当前的持有者一个回调对象。
(2)、abstract Canvas lockCanvas();
// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了
(3)、abstract Canvas lockCanvas(Rect dirty);
// 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。
// 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。