學習Android中設計模式的筆記和總結(二)

2021-07-09 09:18:57 字數 2190 閱讀 8308

廢話不多說,進入正題吧。

我們都知道,android的繪圖是使用畫布(canvas)來把圖顯示於view的視窗裡,並且從view類別而衍生子類別,提供更多功能來將圖形或繪製於畫布上。如圖2-1所示:

圖2-1 tm模式圖

這張圖中,我們可以找到乙個eit造形。

在view類別裡有個ondraw()函式,view類別體系裡的每乙個類別都必須覆寫(override) 這個ondraw()函式,執行實際繪圖的動作。

下面就來分析一下繪圖機制,首先先看圖2-2:

圖2-2 android 繪圖分析圖

機制:viewroot是view的client,view中的draw方法作為viewroot的介面,簡稱為ci,viewroot通過windowmanagerservice(wms),wms 再通過su***ceflinger類要到畫圖的buffer(這裡的buffer就是canvas)。viewroot拿到canvas後通過draw方法把canvas傳遞給view的ondraw方法,view再傳遞給特定的子類的,這裡用myview表示。之後,myview就可以在canvas上畫圖了。

因為圖是直接畫在canvas上的,就直接投射到畫圖的緩衝區buffer中,然後就直接在螢幕上顯示了。

**部分:

public class myview extends view 

@override protected void ondraw(canvas canvas)

}

平時,我們寫**的時候只是寫myview部分,也就是t部分,而e和i由體統為我們提供,通過上面的分析,介紹了eit作為整體的協同工作。讓讀者對e和i有更深刻地了解,讓讀者明白這個canvas是通過eit的造形送過來的。viewroot、view、myview和draw、ondraw方法整體構成了android中繪圖使用畫布的模板方法模式。

android中處處可見tm模式。

比如ibinder介面,如下圖所示:

圖2-3 ibinder中的mt模式

以遊戲的繪圖迴圈(game loop)為例

遊戲的基本動作就是不斷的進行繪圖和重新整理(refresh)畫面。其中,ondraw()函式實踐畫圖,將圖形繪製於view的畫布(canvas)上,並顯示出來;而invalidate() 函式則啟動畫面的重新整理,重新呼叫一次 ondraw()函式。如圖3-1所示:

圖3-1遊戲繪圖迴圈圖

存在兩個畫圖的buffer,乙個叫做frontbuffer,乙個叫做backgroundbuffer。這兩個一直在更換,當正在畫frontbuffer的時候,顯示的是backgroundbuffer;當正在畫backgroundbuffer的時候,顯示的是frontbuffer。

在view多了兩個方法invalidate()和invaludatechildinparent(),子類呼叫父類view的invalidate()方法,view中的 invalidate()呼叫viewroot中的 invaludatechildinparent(),invaludatechildinparent()方法內部呼叫wms,wms呼叫su***cefliger類從而達到兩個buffer(畫布)的相互轉化,從而構成遊戲的迴圈(game loop)。

**部分:

public class myview extends view 

@override protected void ondraw(canvas canvas) catch (interruptedexception ie) {}

invalidate();

}}

總結:這個是在模板方法的基礎上加入invalidate等方法改變而來的,進而形成了框架。我們可以看出,由eit變成tm模式,在把tm模式擴大,就變成了框架啦。

尋找android中的設計模式(三)

尋找android中的設計模式 三 尋找工廠模式 工廠模式的家族分四種 靜態工廠模式 簡單工廠模式 工廠方法模式 抽象工廠模式。下面以開冒菜店為例,假設我定義了一家冒菜店 public class maocaistore else if type.equals zhongla else if typ...

Android中的設計模式 介面卡模式

從名字上就可以看出介面卡是為了針對介面不匹配的情況,而做出的相容方法,假設我們有乙個已經存在的類adaptee,其中有一些已經存在並實現好的方法methoda。但是客戶不希望呼叫這個類,而是希望呼叫乙個特定的介面例如target介面。於是如果想要呼叫adaptee.methoda 方法,建立乙個ad...

Android中的設計模式之直譯器模式

給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器適用該表示來解釋語言中的句子。當有乙個語言需要解釋執行,並且你可將該語言中的句子表示為乙個抽象語法樹時,可使用直譯器模式。而當存在以下情況時該模式效果最好 例 s aba ef a cd符號 表示推導 符號 表示閉包,意思就是符號a可...