2011-10-08 79 views
1

我期待在從谷歌的示例應用程序,它採用觸摸繪圖用帆布交易之一:的Android - 畫布繪製懷疑

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.html

我有幾個疑惑:

  1. 我無法理解Canvas與位圖角色 的作用。

  2. drawPoint功能,我不能夠 瞭解此代碼段:

mCanvas.drawCircle(x, y, radius, mPaint); 
mRect.set((int) (x - radius - 2), (int) (y - radius - 2), 
      (int) (x + radius + 2), (int) (y + radius + 2)); 
invalidate(mRect); 

如果循環已經被拉入上面的帆布,然後什麼情況onDraw功能,其中給出以下代碼:

canvas.drawBitmap(mBitmap, 0, 0, null);

回答

2

帆布VS位圖

一個Bitmap是什麼顧名思義:一個正常的圖像作爲位圖。 Canvas類是位圖編輯器。您使用它來更改位圖數據,它包含所有繪圖方法。這個原則的行爲類似於共享首選項(如果你已經與他們合作),你有一個SharedPreferences類擁有的偏好,和Editor類改變的東西。

繪製圓

此代碼類似於double buffering東西。 drawPoint()基本上畫了一個圓圈到mBitmap對象1中。 但是此位圖對象尚不可見。它存在於內存中。當調用onDraw()時,它有一個代表視圖的繪圖表面的參數CanvasdrawBitmap()在這裏所做的就是使用內存中的準備好的位圖並在視圖圖形表示中繪製它,以使其可見。

¹用過的畫布mCanvas綁定到mBitmaponSizeChanged()

+0

在'drawPoint()',圓圈繪圖調用不涉及任何位圖了!請參閱:'mCanvas.drawCircle(x,y,radius,mPaint);'這是如何工作的? – jeffreyveon

+0

是的,這就是我的¹點意味着什麼。當mBitmap以特定大小創建時,mCanvas被分配給它(行'newCanvas.setBitmap(newBitmap);',稍後在'mBitmap = newBitmap; mCanvas = newCanvas')。從此mCanvas編輯「mBitmap」中的數據。這裏使用'mCanvas',它包含第一段描述的繪圖函數'drawCircle()'。該圓圈被繪製在位圖所保存的像素數據中。 :) – 2011-10-08 16:00:59

+0

太棒了,非常感謝。現在很清楚。 – jeffreyveon

0
  1. 從Android SDK:

    Canvas類持有的 「畫」 的電話。要繪製東西,您需要4個基本組件:A Bitmap來保存像素,一個Canvas來承載繪製調用(寫入位圖),繪製原語(例如Rect,Path,文本,位圖)和繪製(描述繪圖的顏色和樣式)。

  2. 我假設你指的這個片段:

    @Override protected void onDraw(Canvas canvas) { 
        if (mBitmap != null) { 
         canvas.drawBitmap(mBitmap, 0, 0, null); 
        } 
    } 
    

    那麼它看起來像一個繼承onDraw方法,它在默認情況下可能是「什麼也不做」的覆蓋,因此覆蓋實際上給它一些行爲,在這種情況下,給定一個非null的位圖實例,使畫布繪製它。

0

如果你去developper REFFERENCE:

drawBitmap(位圖位圖,左浮動,浮頂,油漆塗料)

繪製 指定的位圖,其頂部/ (x,y)處的左角,使用由當前矩陣轉換的指定顏色。

然後,如果你看到mBitmap不在類的存在,這就是導致該變種來源於從另一個活動的延伸。

Canvas也有一個setBitmap(位圖位圖)函數。那麼解決方法就是在畫布上繪製,如果你已經設置了一個位圖對象。