上一次說到Android的Activity與J2ME的MIDlet的比較,那麼這一次將要做對比的兩個類,分別是J2ME的Displayable類與Android的View類。
說到Displayable類,也許大家沒怎麼直接用過,但是Canvas和Form這兩個類對於J2ME手機編程的同學來說一定非常熟悉,它們分別是呈現低級使用者UI和進階使用者UI所必不可少的。以Canvas為例,J2ME對其封裝了大量可被繼承和Override的方法(其中paint(Graphics g)方法必須重寫),這些方法的功能涵蓋了觸控螢幕操作響應、按鍵響應以及螢幕繪製等多個方面。通過這些方法,我們可以監聽使用者的輸入,並且向使用者反饋不同的輸出,即重新整理屏顯。上述功能是canvas作為UI必須要做的事情。
Android中的View類,功能還要強大很多,通過Override它的onDraw(Canvas canvas)方法可以實現螢幕的繪製,觸控螢幕響應與按鍵響應也通過設定預設的listener得以實現。
原理上說起來,這兩個又是非常相像的,不過區別也很大,我列舉幾個我發現的區別。
1、repaint()方法與invalidate()/postInvalidate()方法
如果去讀API,我們可以發現J2ME中Canvas的repaint()與Android中View的invalidate()/postInvalidate()方法實現了相同的功能(連解說文字幾乎都一樣…),但是invalidate()/postInvalidate()兩者卻有著區別:invalidate()只能在UI這個線程裡通過調用onDraw(Canvas canvas)來update螢幕顯示,而postInvalidate()是要在non-UI線程裡做同樣的事情的。這就要求我們做判斷,哪個調用是本線程的,哪個不是,這在做多線程callback的時候尤為重要。而在J2ME中,不管怎樣直接調用repaint()就好了
2、另外,Android的View類的顯示很大程度上是從XML中讀取的,包括了它的layout與很多屬性,至於怎麼讀的以後再談。而Canvas只需要Custom Draw就可以了,而且Canvas不能設定大小(那個fullScreenMode免談),但是View可以。
3、View的建構函式,我們不需要再Activity中調用,但是Displayable的是必須的。在Activity中,我們要通過findViewById來從XML中取得View,然後強制轉換成View的子類型即可,而J2ME的Canvas是一定要構造出來的。
4、也許在UI的應用上,Android比J2ME強大的地方,就在於它的View有很多定義好的子類能讓我們調用,就像VS.net中WinForm編程中那些控制項一樣,會很方便,也很漂亮。因為Android開源,將來普及之後一定會有很多第三方的控制項能為我們所用,這才是大大拓展了Android之處。這會把我們從那些graphics.drawXXX函數中解放出來,也能讓我們的應用程式變得更酷更炫。
關於對View(Android)和Displayable(J2ME)——主要是Canvas的比較我就談這麼多,我想會有很多地方沒有考慮到,以後再補充吧。還是老樣子,怎麼用去讀API和樣本程式,我就不多說了。
下一次應該是對Android的Bitmap類以及J2ME的Image類進行比較。
謝謝!