網頁

2011年6月26日 星期日

Android學習_高速繪圖SurfaceView基本架構Part1

最近在跟幾個同事討論一個問題,「一個看起來不錯用的網站需要什麼?」,執行無誤的功能?切合需求的模組?簡易上手的流程?當然這些可能都缺一不可,但有一項更重要的要件是"適合的視覺感受"。這東西...雖然強求不來,但是拿到相對應的圖檔後,該怎麼樣放在程式中倒是一個應該先熟悉的事情。

理論上來說繪圖應該要從Canvas開始,但是訪間書上在說繪圖的章節實在都非常的..."帶過",所以秉持著先抄再懂OLA學習模式,買了一本"深入淺出Android遊戲程式開發範例大全",原因是遊戲其中一個部分就是一直畫。

近幾個星期五都會決定這星期要K的主題,本來想著"這星期就找個輕鬆有趣的來讀讀吧",結果....果然"遊戲擁有第二先進的技術及最高的程式要求"。

-------------------------------------------------------------------
書的後半段,有著很多的遊戲範例,挑了一個看似比較簡單的範例照抄了一下。
目標:在一個有背景的SurfaceView操作一顆足球左右跑。
架構:


共分為四個部分:
1. OlaTeach_game1 extends Activity:作為程式啟動的起點
2. OlaView extends SurfaceView:註冊繪圖物件,顯示繪圖的成果
3. OlaDrawThread extends Thread:負責繪圖的Thread
4. OlaBall extends Thread:負責當好一顆球(計算球的運動方式)

流程:
1. 程式啟動,OlaTeach_game1觸發onCreate。
2. 建立OlaView(new),觸發OlaView的建構式,一併由該建構式建立OlaDrawThread與OlaBall兩個Thread。
3. SetContentView觸發 OlaView的surfaceCreated(),並由該函式啟動OlaDrawThread。
4. 執行OlaView的startMove(),並由該函式啟動OlaBall。
5. 由OlaDrawThread這個Thread執行OlaView的DoDraw來不斷重新繪製OlaView。
6. 啟動OlaBall後,由該Thread不斷計算球最後的落點(X,Y)。
7. 由DoDraw來觸發OlaBall的drawSelf來繪製球。

重要程式碼:
1. 繪製SurfaceView(必須先取得View的getHolder,在繪圖之前先上鎖,畫完以後再解鎖)
OlaView內

getHolder().addCallback(this);//新增Callback介面
OlaDrawThread dt = new OlaDrawThread(this,getHolder());//新建後臺更新螢幕執行緒

OlaDrawThread內

SurfaceHolder surfaceHolder = surfaceHolder; //利用建構式接surfaceHolder
canvas = surfaceHolder.lockCanvas(null); //為畫布加鎖
OlaView.doDraw(canvas); //重繪畫布
surfaceHolder.unlockCanvasAndPost(canvas); //解鎖畫布

自以為白話解說:
目標是要在畫面上繪製一個會動的球,所以準備了一個放畫布的架子(Activity),一個畫布(OlaView),一個畫畫的人(OlaDrawThread),一個球(OlaBall)。

因為我們想要隨時看到畫的情況,所以我們並不希望"秀畫布、畫畫與計算球位子"這三件事情互相干擾,所以除了看畫布這件事情以外,對於畫畫跟計算球位子都由另一個Thread來負責,也就是可以想成在程式一開始的時候,就叫了三個人來幫忙,第一個人負責把畫布端給我們看結果,一個人負責一直畫畫,一個人一直計算球的位子。
感覺就像.....

我需要重修美勞。

1 則留言:

  1. 圖超可愛XDDD

    解說也很棒,感謝分享

    回覆刪除