這一回該說到Android與J2ME下,作為自訂繪製的UI呈現所必不可少的組成部分——映像。
如果你在J2ME下做過手機遊戲,尤其是那種橫版過關型的,就少不了從資源檔裡產生Image對象,然後用該死的graphics.drawImage(Image,int,int,int)等一系列方法將映像繪製到指定的位置。Android雖然漂亮N多,但是這種事情也不能倖免——它的canvas.drawBitmap(Bitmap,int,int,Paint)就是做這個用的。
乍一看這兩個東西好像又沒什麼區別了,至少在繪製方面又如出一轍。的確如此,但是天下沒有兩片同樣的樹葉,更何況是兩個class。仔細一看,Image與Bitmap的對象,在構造上還是有著很大的區別的。
先來看J2ME,Image類沒有公開的建構函式,但是有一大堆靜態creatImage()方法,這N多種重載能讓你從檔案名稱、資料流、已經構造好的Image對象甚至位元組數組裡建立出Image對象來,建立出來你就能用了,還算挺方便的。但是Android則不然,它那個Bitmap類,若要從資源檔構造,可麻煩得要死,請看代碼: Resources r = getResources();
Bitmap board = Bitmap.createBitmap(240, 240, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(board);
Drawable tempBoard = r.getDrawable(R.drawable.board);
tempBoard.setBounds(0, 0, 240, 240);
tempBoard.draw(c);
這段代碼是在Activity裡面調用的,Resources只是說明我們的Bitmap是從資源檔裡面構造的,並沒有其他的特別之處。可以看到,Bitmap與Image一樣,也沒有通過建構函式而是通過靜態方法得到了它的執行個體(這一點和Image類是一樣的)。Bitmap.createBitmap(int,int,Bitmap.config)方法只是建立了一個空的Bitmap對象(這個空不是null 指標null,有些類似於Null 字元串"",至少我是這麼理解的),然後通過Canvas類(這是Android的Canvas類,不是J2ME的)的構造方法,將Bitmap對象傳遞進去,再利用Drawable.draw(Canvas)方法把Drawable對象(已經很接近資源檔了)畫到Canvas上,這樣才讓Bitmap與資源檔夾drawable裡的png之類的影像檔套上關係……
這個過程好麻煩哦,說好聽的是Bitmap難以高攀,說不好聽的就是脫了褲子放屁。J2ME一步到位的事情,它做了三步,雖說不怎麼複雜,但是為什麼這麼做估計只有google知道。
執行個體建立好了,也初始化過了,於是能用了,說起來Bitmap在用法上還是很靈活的,能給好多地方使用,而且跟J2ME的Image用法極為相似,這點挺讓人滿意的。
對這兩個類的比較就到這裡了,下一次來比較一下J2ME與Android在響應按鍵輸入以及觸控螢幕事件方面的異同。
謝謝!