View,是Android的一個超類,這個類幾乎包含了所有的螢幕類型。每一個View都有一個用於繪圖的畫布,這個畫布可以進行任意擴充。
在遊戲開發中葉可以自訂視圖(View),這個畫布的功能更能滿足我們在遊戲開發中的需要。在Android中,任何一個View類都只需重寫onDraw 方法來實現介面顯示,自訂的視圖可以是複雜的3D實現,也可以是非常簡單的文本形式等。
遊戲的核心是不斷地繪圖和重新整理介面,Android中提供了 invalidate 方法來實現介面重新整理。注意,invalidate 不能直接線上程中調用, 就是不可以在子線程中調用,因此它違背了 Android的單執行緒模式:Android UI操作並不是安全執行緒的,並且這些操作必須在UI 線程中執行,因此Android中最常用的方法就是利用Handler來實現UI線程的更新。 其實用 AsyncTask 也可以。
具體樣本:
Activity:
public class Activity01 extends Activity {</p><p>private static final String TAG = "mThread";<br />private static final int REFRESH = 0x000001;<br />private GameView mGameView = null;</p><p>@Override<br />public void onCreate(Bundle savedInstanceState) {<br />super.onCreate(savedInstanceState);</p><p>this.mGameView = new GameView(this);<br />mGameView.x = 320.0f;<br />mGameView.y = 120.0f;<br />setContentView(mGameView);</p><p>new Thread(new GameThread()).start();<br />}</p><p>Handler myHandler = new Handler() {</p><p>@Override<br />public void handleMessage(Message msg) {</p><p>switch (msg.what) {<br />case Activity01.REFRESH:<br />mGameView.invalidate();// repaint View<br />break;<br />}<br />super.handleMessage(msg);<br />}<br />};</p><p>class GameThread implements Runnable {</p><p>@Override<br />public void run() {<br />while (!Thread.currentThread().isInterrupted()) {<br />Message message = new Message();<br />message.what = Activity01.REFRESH;</p><p>Activity01.this.myHandler.sendMessage(message);<br />try {<br />Thread.sleep(1000);<br />} catch (InterruptedException e) {<br />Thread.currentThread().interrupt();<br />}<br />}<br />}<br />}</p><p>@Override<br />public boolean onTouchEvent(MotionEvent event) {<br />if(event.getAction() == MotionEvent.ACTION_DOWN){<br />mGameView.x = event.getX();<br />mGameView.y = event.getY();<br />}</p><p>return true;<br />}</p><p>@Override<br />public boolean onKeyDown(int keyCode, KeyEvent event) {<br />if(keyCode == KeyEvent.KEYCODE_BACK){<br />this.finish();<br />}</p><p>return true;<br />}<br />}
gameview
public class GameView extends View {<br />int count = 0;<br />float x = 0, y = 0;</p><p>public GameView(Context context) {<br />super(context);<br />}</p><p>public void onDraw(Canvas canvas) {<br />if (count < 100) {<br />count++;<br />} else {<br />count = 0;<br />}</p><p>Paint mPaint = new Paint();<br />switch (count % 4) {<br />case 0:<br />mPaint.setColor(Color.BLUE);<br />break;<br />case 1:<br />mPaint.setColor(Color.GREEN);<br />break;<br />case 2:<br />mPaint.setColor(Color.RED);<br />break;<br />case 3:<br />mPaint.setColor(Color.YELLOW);<br />break;<br />default:<br />mPaint.setColor(Color.WHITE);<br />break;<br />}</p><p>canvas.drawRect(x - 40, y - 20, x + 40, y + 20, mPaint);<br />}<br />}<br />
運行效果:
源碼下載