在View的學習中,借鑒以往JavaME的經驗,這裡首先把它們使用到的一些類、方法等簡單做下類比:
Android-->JavaME
View-->Canvas
Canvas-->Graphics
onDraw(Canvas canvas)-->paint(Graphics g);
.
.
.
好,為直觀起見,先呈出
ViewMain類代碼
package demo.view;</p><p>import android.content.Context;<br />import android.graphics.Bitmap;<br />import android.graphics.BitmapFactory;<br />import android.graphics.Canvas;<br />import android.graphics.Color;<br />import android.graphics.Paint;<br />import android.graphics.Rect;<br />import android.graphics.Paint.Style;</p><p>import android.view.KeyEvent;<br />import android.view.View;</p><p>public class ViewMain extends View {</p><p>private int x = 5;<br />private int y = 30;</p><p>private int width;//螢幕寬度<br />private int height;//螢幕高度<br />private Paint paint;//聲明畫筆</p><p>public ViewMain(Context context) {<br />super(context);</p><p>this.setFocusable(true);//設定焦點<br />}</p><p>//重寫父類View的onDraw()方法<br />//類似於j2me中重寫父類Canvas的paint()方法<br />protected void onDraw(Canvas canvas) {<br />//android應用開發中的Canvas類似於j2me中的Graphics<br />super.onDraw(canvas);<br />width = this.getWidth();<br />height = this.getHeight();//擷取螢幕高、寬度</p><p>//執行個體化“畫筆”Paint,暫時把paint理解為畫筆<br />paint = new Paint();<br />//清屏<br />this.clearScreen(canvas);</p><p>paint.setColor(Color.BLACK);<br />//比較奇怪一點,竟然沒有錨點這個東西,難道drawText預設的就只左下角?繼續探索<br />canvas.drawText("Hello!麥田守望者", 0, 20, paint);</p><p>// 繪圖<br />// 從資源檔中產生位元影像<br />Bitmap bmMe= BitmapFactory.decodeResource(getResources(), R.drawable.me);<br />Bitmap bmTiger= BitmapFactory.decodeResource(getResources(), R.drawable.tiger);<br />//繪圖<br />//依舊是錨點問題drawBitmap預設的錨點是左上方<br />canvas.drawBitmap(bmMe, x, y, paint);<br />canvas.drawBitmap(bmTiger, 10 + bmTiger.getWidth(), 30, paint);<br />}</p><p>private void clearScreen(Canvas canvas) {<br />//設定畫筆顏色<br />paint.setColor(Color.WHITE);</p><p>//設定畫筆paint樣式:填充;<br />//多說一句,在j2me中,以下兩行代碼可以用fillRect()方法直接實現,但其各有利弊。<br />paint.setStyle(Style.FILL);<br />//用白色填充背景<br />canvas.drawRect(new Rect(0, 0, width, height), paint);<br />}</p><p>@Override<br />public boolean onKeyDown(int keyCode, KeyEvent event) {//按鍵被按下<br />switch(keyCode) {<br />case KeyEvent.KEYCODE_DPAD_UP:<br />y -= 2;</p><p>System.out.println("UP");<br />break;<br />case KeyEvent.KEYCODE_DPAD_DOWN:<br />y += 2;</p><p>System.out.println("DOWN");<br />break;<br />case KeyEvent.KEYCODE_DPAD_LEFT:<br />x -= 2;</p><p>System.out.println("LEFT");<br />break;<br />case KeyEvent.KEYCODE_DPAD_RIGHT:<br />x += 2;</p><p>System.out.println("RIGHT");<br />break;<br />}<br />this.postInvalidate();<br />return super.onKeyDown(keyCode, event);<br />}</p><p>}<br />
在繪製UI上,須重寫onDraw方法,第一點比較奇怪,在螢幕高、寬的擷取上getWidth(),getHeight()寫在建構函式中竟然無法擷取,也就是說取值為0。那看來必須將其寫入到onDraw中。第二點比較奇怪的就是關於錨點的問題,發覺Android中在draw的方法中如drawText("Hello!麥田守望者", 0, 20, paint),沒有錨點,“預設的”把"Hello!麥田守望者"的左下角繪製在座標(0,20)上,這一點感覺做的不如JavaME。
關於按鍵響應,我起初疑惑,有onKeyUp()、onKeyDown()怎麼偏偏沒有onKeyLeft()、onKeyRight()?翻閱相關文檔才發現onKeyUp()、onKeyDown()指的是按鈕被抬起,按下時的響應,而不是指方向鍵的的四個方向。這裡我只重寫了onKeyDown方法,即按鍵被按下時的響應函數。這裡,也就相當於JavaME中的keyPressed()和keyReleased()。android手機的一個重要特點是其螢幕很大,幾乎都支援觸控螢幕,稍微遺憾一點,觸控螢幕的實現稍後的學習中再講了。
關於按鈕響應,千萬不要忘記調用this.postInvalidate(),有過JavaME經驗的人就會知道,這也就有點相當於repaint()、serviceRepaints()以及flushGraphics()等方法。最後重要的一點,並不是說重寫了onKeyDown()就可以做出響應的,還需有個“綁定”,即setFocusable(true)。
暫時先講到這,墨水有限,繼續蘸墨!