引用:http://www.linuxidc.com/Linux/2011-11/48318.htm

// 设置Paint为无锯齿
32 mPaint.setAntiAlias(true);

全文

症状:游戏过程中,按下Home键返回手机主菜单,再点击游戏图标试图返回游戏的时候屏幕黑的一片!

以前一直没在意只有结束线程在运行游戏,今天觉得改仔细琢磨一下这个问题了!

首先第一件事:打印Logo看看按下Home键后会调用哪些方法,结果如下:

游戏过程中按下Home后:

11-29 20:42:07.090: I/System.out(18835): Activity onPause...
11-29 20:42:14.190: I/System.out(18835): Activity onStop...
11-29 20:42:14.260: I/System.out(18835): SurfaceView surfaceDestroyed...

可见SurfaceView 在返回手机主菜单的时候被销毁了,而我的SurfaceView 主线程是在构造方法里创建的

那么我们返回游戏的时候会调哪些方法呢?接着看Log:

11-29 20:48:06.940: I/System.out(18835): Activity onRestart...
11-29 20:48:06.950: I/System.out(18835): Activity onResume...
11-29 20:48:07.230: I/System.out(18835): SurfaceView surfaceCreated...
11-29 20:48:07.240: I/System.out(18835): SurfaceView surfaceChanged...

surfaceDestroyed 的时候线程已经退出了运行,这时再返回到游戏刷屏的线程就没了,任何绘制方法都没调用,所以你看到的只有黑漆漆的屏幕啦!
明白了运行原理我们就知道改怎么做啦!

首先创建线程放在surfaceCreated ,并启动线程,

当surfaceDestroyed 调用的时候,线程已经无效了,我们把线程对象设为null释放他,

然后不管怎么返回线程都会继续运行你的游戏也就不会中断了,来段简单的代码更具表达力度!

    1. packagecom.game.view;
    2. importAndroid.content.Context;
    3. importAndroid.graphics.Canvas;
    4. importAndroid.graphics.Paint;
    5. importAndroid.graphics.Paint.Style;
    6. importAndroid.graphics.Rect;
    7. importAndroid.view.SurfaceHolder;
    8. importAndroid.view.SurfaceHolder.Callback;
    9. importAndroid.view.SurfaceView;
    10. publicclassTestViewextendsSurfaceViewimplementsCallback,Runnable{
    11. publicstaticfinalintGAME_HEART=1000/30;//每秒刷新30次
    12. publicstaticintscreenW,screenH;
    13. privateThreadthread;
    14. privateSurfaceHolderholder;
    15. privatePaintpaint;
    16. publicTestView(Contextcontext){
    17. super(context);
    18. //TODOAuto-generatedconstructorstub
    19. holder=getHolder();
    20. holder.addCallback(this);
    21. paint=newPaint(Paint.ANTI_ALIAS_FLAG);//无锯齿
    22. paint.setStyle(Style.FILL);//填充样式
    23. paint.setTextSize(16);//字体大小
    24. }
    25. /**
    26. *执行游戏逻辑方法
    27. */
    28. privatevoidupdate(){
    29. }
    30. /**
    31. *执行游戏绘制
    32. */
    33. privateRectrect=newRect();
    34. privatevoiddraw(){
    35. Canvascanvas=holder.lockCanvas();
    36. Stringtext="天使之翼的示例Demo";
    37. //获取文本宽高
    38. paint.getTextBounds(text,0,text.length(),rect);
    39. //在屏幕中央位置显示文本
    40. paint.setColor(0xfff000f0);//注意最高两位ff代表画笔透明度,不设置的画就是完全透明了,看不到任何效果
    41. canvas.drawText(text,
    42. (screenW-rect.width())/2,
    43. screenH/2+rect.height()/2,
    44. paint);
    45. holder.unlockCanvasAndPost(canvas);
    46. }
    47. @Override
    48. publicvoidsurfaceCreated(SurfaceHolderholder){
    49. //TODOAuto-generatedmethodstub
    50. screenW=getWidth();
    51. screenH=getHeight();
    52. thread=newThread(this);
    53. isRun=true;
    54. thread.start();
    55. }
    56. @Override
    57. publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){
    58. //TODOAuto-generatedmethodstub
    59. //当屏幕旋转的时候重新获取屏幕宽高
    60. screenW=getWidth();
    61. screenH=getHeight();
    62. }
    63. @Override
    64. publicvoidsurfaceDestroyed(SurfaceHolderholder){
    65. //TODOAuto-generatedmethodstub
    66. isRun=false;
    67. thread=null;
    68. }
    69. privatebooleanisRun;//线程运行标志
    70. privateintuseTime;//记录每次刷屏使用的时间
    71. @Override
    72. publicvoidrun(){
    73. //TODOAuto-generatedmethodstub
    74. longstart,end;
    75. while(isRun){
    76. start=System.currentTimeMillis();
    77. update();//刷新界面上所有元素
    78. draw();//绘制界面元素
    79. end=System.currentTimeMillis();
    80. useTime=(int)(end-start);
    81. if(useTime<GAME_HEART){//保证每次刷屏时间间隔相同
    82. try{
    83. Thread.sleep(GAME_HEART-useTime);
    84. }catch(InterruptedExceptione){
    85. //TODOAuto-generatedcatchblock
    86. e.printStackTrace();
    87. }
    88. }
    89. }
    90. }
    91. }

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android(安卓)JNI 之 JNIEnv 解析
  3. android_UIThread 主线程 AsynTask Handler View.post
  4. android service 广播 更新 activity
  5. Android(安卓)- 第二章 Activity 探究
  6. Android开发经验之获取画在画布上的字符串长度、宽度(所占像素宽
  7. 【读书笔记-《Android游戏编程之从零开始》】5.Android(安卓)游
  8. android 屏幕触摸事件的分发与处理
  9. Android的handler和callback机制

随机推荐

  1. Android NDK开发之Jni的数据类型
  2. [置顶] 【Android应用开发】Android(安卓
  3. Android L还未正式到来 Android M已崭露
  4. Android百度推送使用详解
  5. android通过反射代替R来获取控件对象
  6. 关于Android下的JNI编程、SO库以及NDK的
  7. 同样的互联网大环境下,你连工作都找不到,年
  8. Android中的UI界面控制方式和自定义View
  9. android 画图
  10. Android ORM框架 GreenDao 的使用详解