對於Canvas和Bitmap的一點認識,CanvasBitmap認識
在Android關於Canvas的API描述中,一開始就如下描述:
To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap),
a drawing primitive (e.g. Rect, Path, text, Bitmap), and a paint (to describe the colors and styles for the drawing).
先翻譯一下這句話,
想畫一些東西的時候,你需要4個基本的組件,一個Bitmap來儲存像素,一個Canvas來接收draw的調用(draw的結果是將像素給畫到前面所講的Bitmap中),
一個源,即是你想畫的東西(比如矩形,路徑,文本,抑或另一個位元影像),最後就是一個畫筆(描述想畫的顏色和風格等)
無意中看到這描述,我對Canvas和Bitmap的理解突然間有種原來就是這麼簡單的感覺。
Bitmap
首先想像一下,我們在螢幕上看到的映像,都是由一個一個的像素組成的,那麼這些像素是從哪來的?由上面這句話,我們就知道答案了,這些像素就是存放在
Bitmap中的,由此,我們可以認為Bitmap就是用來直接展示在視窗上的一個顯示對象,它是一個最終的產品。
我們知道,通過BitmapFactory,我們可以從資源(Resource),InputStream和檔案中建立出一個Bitmap,並將其交給控制項使用。
public static Bitmap readBitmapFromResource(Context context, int resId) { BitmapFactory.Options op = new BitmapFactory.Options(); op.inPreferredConfig = Bitmap.Config.ARGB_8888; op.inDither = false; op.inScaled = false; InputStream is = context.getResources().openRawResource(resId); return BitmapFactory.decodeStream(is, null, op); }
Canvas
那麼怎麼理解Canvas呢?
Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888); Canvas canvas = new Canvas(bitmap);
上面是建立Canvas的一段代碼,由這,我們知道,要建立Canvas,必須先建立一個Bitmap對象,並將其作為參數傳給Canvas。
那麼,我們可以只建立Canvas,然後不給其傳遞Bitmap對象嗎?
不可以!
為什嗎?
Canvas 本意是畫布的意思,但是在Android中,它就只是一個媒介,可以通過Canvas來調用drawRect,drawCircle等等,但是實際上畫的這些東西最終展現的時候,
都是像素,但是只有Bitmap才能儲存像素,而Canvas並不行,所以在建立Canvas的時候,就必須傳遞一個Bitmap,用來承載畫的內容。
可以這麼理解,現在在我們面前有一張空白的紙(Bitmap),但是我們不能將畫筆直接點到上面,我們必須先在這張紙上面放一塊畫布(Canvas),然後我們在這張畫布上
開始點點點…最後,我們就可以看到,我們所有的形為都通過畫布作用到紙上了,這時候,那張空白的紙已經是一張畫了,而我們掀掉畫布,就能夠直接將這張畫給別人看了。
而此時,Canvas已經沒有作用了,它的作用只在於承接我們的畫筆操作,然後將所對應位置的像素儲存到對應的Bitmap中。
canvas.drawPath(mPath, mHighlightPaint); return bitmap;
不知道,這麼說,大家能夠理解Canvas和Bitmap的關係不?
簡單地說,我們要進行畫畫的操作,我們需要通過Canvas來實現,但是每一個Canvas都必須有相對應的Bitmap來承載內容,我們在Canvas上所作的操作最終都是會寫到Bitmap中的。
而最終展現給使用者看的內容,也是通過Bitmap來展現的。
上面還講到兩個東西,一個drawing primitive,一個paint,就比較好理解了,就不在這裡多說了。
Drawable
而我們經常還會遇到一個Drawable的類,那這個東西又是什麼呢,跟Bitmap又有什麼關係呢?
A Drawable is a general abstraction for “something that can be drawn.”
Drawable就是能夠被畫到畫布上的對象。
所以,Bitmap是一種Drawable,於是有了BitmapDrawable,顏色是一種Drawable,所以有了ColorDrawable. 形狀是一種Drawable,所以有了ShapeDrawable。
個人覺得,它就是一個類似介面之類的東西,而本質上它也是一個抽象類別,繼承了Drawable,就表明這東東是可繪製的。