註:本文譯自:http://developer.android.com/guide/topics/graphics/2d-graphics.html
Android架構API提供了一組2D描畫API,使用這些API能夠在一個畫布(canvas)上渲染自己的定製圖形,也能夠修改那些既存的View對象,來定製它們的外觀和視覺效果。在繪製2D圖形時,通常要使用以下兩種方法中的一種:
1. 把圖形或動畫繪製到布局中的一個View對象中。在這種方式中,圖形的繪製是由系統通常的繪製View層次資料的過程來處理的---只需簡單的定義要繪製到View對象內的圖形即可。
2. 把圖形直接繪製在一個畫布對象上(Canvas對象)。這種方法,要親自調用相應類的onDraw()方法(把圖形傳遞給Canvas對象),或者調用Canvas對象的一個draw…()方法(如drawPicture())。在這個過程中,還可以控制任何動畫。
當想要把不需要動態變化和沒有遊戲效能要求的一個簡單的圖形繪製到View對象時,方法一是最好的選擇。例如,在想要在一個靜態應用程式中,顯示一個靜態圖形或預定義動畫時,就應該用方法1把圖形繪製到一個View對象中。
當應用程式需要經常重新繪製自己的時候,使用方法2把圖形繪製到Canvas中,是一個比較好的選擇。像視頻遊戲這樣的應用程式,就應該在它們自己的Canvas對象上繪製圖形。但是,有更多的方法來完成繪製任務:
1. 在與UI的Activity相同的線程中,建立布局中一個定製的View對象組件,就先要調用invalidate()方法,然後處理onDraw()回調方法;
2. 在一個獨立的線程中,管理著SurfaceView對象,並且使用線程來執行把圖形繪製到Canvas對象上的任務(不需要請求invalidate()方法)。
用Canvas對象來繪製圖形(Draw with a Canvas)
當要編寫專業的繪圖或控製圖形動畫的應用程式時,應該使用Canvas對象來盡心繪製操作。Canvas用一個虛擬平面來工作,以便把圖形繪製在實際的表面上---它持有所有的用draw開頭的方法調用。通過Canvas對象,實際上是執行一個底層的位元影像繪製處理,這個位元影像被放置到視窗中。
在onDraw()回調方法的繪製事件中,會提供一個Canvas對象,並且只需要把要繪製的內容交給Canvas對象就可以了。在處理SurfaceView對象時,還可以從SurfaceHolder.lockCanvas()方法來擷取一個Canvas對象。但是,如果需要建立一個新的Canvas對象,那麼就必須在實際執行繪製處理的Canvas對象上定義Bitmap對象。對於Canvas對象來說,這個Bitmap對象是始終必須的,應該像以下樣本這樣建立一個新的Canvas對象:
Bitmap b
= Bitmap.createBitmap(100,
100,
Bitmap.Config.ARGB_8888);
Canvas c
= new
Canvas(b);
現在就可以在被定義的Bitmap對象上繪圖了。在Canvas對象上繪製圖形之後,能夠用Canvas.drawBitmap(Bitmap, …)的一個方法,把該Bitmap對象繪製到另一個Canvas對象中。通過View.onDraw()方法或SufaceHolder.lockCanvas()方法提供的Canvas對象來完成最終的圖形繪製處理是被推薦的。
Canvas類有可以使用的自己的一組繪圖方法,如drawBitmap(…)、drawRect(…)、drawText(…)等。還可以使用其他的有draw()方法類。例如,可能想要把某些Drawable對象放到Canvas對象上。Drawable類就有帶有Canvas對象作為參數的draw()方法。