Android 遊戲開發 SurfaceView架構

來源:互聯網
上載者:User

SurfaceView和View的明顯不同在於Surface不需要通過線程來更新視圖,但在繪製之前必須使用lockCanvas方法鎖定畫布,並得
到畫布,然後繪製,完成後用unlockCanvasAndPost方法解鎖畫布。SurfaceView類的事件處理和View一樣。
繪製介面的類:

1. package com.yarin.android.Examples_05_02;<br /> 2.<br /> 3. import android.content.Context;<br /> 4. import android.graphics.Canvas;<br /> 5. import android.graphics.Color;<br /> 6. import android.graphics.Paint;<br /> 7. import android.view.SurfaceHolder;<br /> 8. import android.view.SurfaceView;<br /> 9.<br /> 10. public class GameSurfaceView extends SurfaceView<br /> 11.<br /> 12. implements SurfaceHolder.Callback,Runnable<br /> 13. {<br /> 14. //控制迴圈<br /> 15. boolean mbLoop = false;<br /> 16.<br /> 17. //定義SurfaceHolder對象<br /> 18. SurfaceHolder mSurfaceHolder = null;<br /> 19. int miCount = 0;<br /> 20. int y = 50;<br /> 21.<br /> 22.<br /> 23. public GameSurfaceView(Context context)<br /> 24. {<br /> 25. super(context);<br /> 26.<br /> 27. // 執行個體化SurfaceHolder<br /> 28. mSurfaceHolder = this.getHolder();<br /> 29.<br /> 30. // 添加回調<br /> 31. mSurfaceHolder.addCallback(this);<br /> 32. this.setFocusable(true);<br /> 33.<br /> 34. mbLoop = true;<br /> 35. }<br /> 36.<br /> 37.<br /> 38. // 在surface的大小發生改變時激發<br /> 39. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)<br /> 40. {<br /> 41.<br /> 42. }<br /> 43.<br /> 44. // 在surface建立時激發<br /> 45. public void surfaceCreated(SurfaceHolder holder)<br /> 46. {<br /> 47. //開啟繪圖線程<br /> 48. new Thread(this).start();<br /> 49. }<br /> 50.<br /> 51. // 在surface銷毀時激發<br /> 52. public void surfaceDestroyed(SurfaceHolder holder)<br /> 53. {<br /> 54. // 停止迴圈<br /> 55. mbLoop = false;<br /> 56. }<br /> 57.<br /> 58. // 繪圖迴圈<br /> 59. public void run()<br /> 60. {<br /> 61. while (mbLoop)<br /> 62. {<br /> 63. try<br /> 64. {<br /> 65. Thread.sleep(200);<br /> 66. }<br /> 67. catch (Exception e)<br /> 68. {<br /> 69.<br /> 70. }<br /> 71. synchronized( mSurfaceHolder )<br /> 72. {<br /> 73. Draw();<br /> 74. }<br /> 75.<br /> 76. }<br /> 77. }<br /> 78.<br /> 79. // 繪圖方法<br /> 80. public void Draw()<br /> 81. {<br /> 82. //鎖定畫布,得到canvas<br /> 83. Canvas canvas= mSurfaceHolder.lockCanvas();<br /> 84.<br /> 85. if (mSurfaceHolder==null || canvas == null )<br /> 86. {<br /> 87. return;<br /> 88. }<br /> 89.<br /> 90. if (miCount < 100)<br /> 91. {<br /> 92. miCount++;<br /> 93. }<br /> 94. else<br /> 95. {<br /> 96. miCount = 0;<br /> 97. }<br /> 98. // 繪圖<br /> 99. Paint mPaint = new Paint();<br /> 100. mPaint.setAntiAlias(true);<br /> 101. mPaint.setColor(Color.BLACK);<br /> 102. //繪製矩形--清屏作用<br /> 103. canvas.drawRect(0, 0, 320, 480, mPaint);<br /> 104. switch (miCount % 4)<br /> 105. {<br /> 106. case 0:<br /> 107. mPaint.setColor(Color.BLUE);<br /> 108. break;<br /> 109. case 1:<br /> 110. mPaint.setColor(Color.GREEN);<br /> 111. break;<br /> 112. case 2:<br /> 113. mPaint.setColor(Color.RED);<br /> 114. break;<br /> 115. case 3:<br /> 116. mPaint.setColor(Color.YELLOW);<br /> 117. break;<br /> 118. default:<br /> 119. mPaint.setColor(Color.WHITE);<br /> 120. break;<br /> 121. }<br /> 122.<br /> 123. canvas.drawCircle((320 - 25) / 2, y, 50, mPaint);<br /> 124. // 繪製後解鎖,繪製後必須解鎖才能顯示<br /> 125. mSurfaceHolder.unlockCanvasAndPost(canvas);<br /> 126. }<br /> 127. }

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.