概括Android系統(tǒng)存在的種種BUG
Android系統(tǒng)還是比較常用的,于是我研究了一下Android系統(tǒng),在這里拿出來和大家分享一下,希望對大家有用。經(jīng)過長時間學(xué)習(xí)Android系統(tǒng)的原理,于是和大家分享一下,看完本文你肯定有不少收獲,希望本文能教會你更多東西。
就界面Layout來說,這個程序其實和Snake沒有什么不同,同樣是采用了FrameLayout,而且游戲的主界面由一個自定義的View來實現(xiàn),這里是LunarView。讀過上一篇文章的朋友也許會發(fā)現(xiàn),Snake的架構(gòu)是“定時器+系統(tǒng)調(diào)用onDraw”來實現(xiàn)的。
這里有一個***的缺陷就是onDraw是由Android系統(tǒng)來調(diào)用的。我們只能依賴它,卻無法自行控制。這就好比一個黑盒,當然,總是能把我們要的東西給做出來,可卻無法控制其做事的細節(jié)。
這對于游戲這樣高效率的東西可是不利的,因此***的解決之道當然是把繪制這部分工作自己”承包“過來,告別吃大鍋飯的,進入”聯(lián)產(chǎn)承包制”時代。此外,由于游戲的本質(zhì)就是連續(xù)兩幀圖片之間發(fā)生些許差異,那么要不斷催生這種差異的發(fā)生,只要有某種連續(xù)不斷發(fā)生的事件在進行就可以。
例如Snake中使用的定時器,就是在不斷地產(chǎn)生這種“差異源”,與此類似,一個線程也是不斷在運行中,通過它也是可以不斷產(chǎn)生這種“差異源”的。如果說Snake中使用的Layout加自定義View是一把小型武器的話,那在SurfaceView對于android中游戲的開發(fā)來說就算是重型武器了。
我們使用前者時總是容易把游戲中某個對象(比如上文的每一個方格)當做一個小組件來處理,而后者則根本沒有這種劃分的概念,在它眼中,所有東西都是在Canvas(畫布)中自行繪制出來的(背景,人物等)。
SurfaceView提供直接訪問一個可畫圖的界面,可以控制在界面頂部的子視圖層。SurfaceView是提供給需要直接畫像素而不是使用窗體部件的應(yīng)用使用的。Android圖形系統(tǒng)中一個重要的概念和線索是surface。View及其子類(如TextView, Button)
要畫在surface上。每個surface創(chuàng)建一個Canvas對象(但屬性時常改變),用來管理view在surface上的繪圖操作,如畫點畫線。還要注意的是,使用它的時候,一般都是出現(xiàn)在最頂層的:The view hierarchy will take care of correctly compositing 。
with the Surface any siblings of the SurfaceView that would normally appear on top of it.使用的SurfaceView的時候,一般情況下還要對其進行創(chuàng)建,銷毀,改變時的情況進行監(jiān)視,這就要用到SurfaceHolder.Callback。
- public void surfaceChanged(SurfaceHolder holder, int format, int width,int height)
- {
- thread.setSurfaceSize(width, height);
- }
- public void surfaceCreated(SurfaceHolder holder)
- {//啟動工作線程結(jié)束
- thread.setRunning(true);
- thread.start();
- }
- public void surfaceDestroyed(SurfaceHolder holder)
- {
- boolean retry = true;
- thread.setRunning(false);
- while (retry)
- {
- try
- {//等待工作線程結(jié)束,主線程才結(jié)束
- thread.join();
- retry = false;
- }
- catch (InterruptedException e)
- {
- }
- }
- }
這個線程由私有類Android系統(tǒng)實現(xiàn),它里面還有一個自己的消息隊列處理器,用來接收游戲狀態(tài)消息,并在屏幕上顯示當前狀態(tài)。(而這個功能在Snake中是通過View自己控制其包含的TextView是否顯示來實現(xiàn)的,相比之下,LunarThread的消息處理機制更為高效)。由于有了LunarThread這個負責(zé)具體工作的對象,所以LunarView的大部分工作都委托給后者去執(zhí)行。
【編輯推薦】