11.4.3 高級畫布繪圖(1)
我們已經在第4章中介紹了Canvas,在那里,已經學習了如何創建自己的View。在第7章中也使用了Canvas來為MapView標注覆蓋。
畫布(Canvas)是圖形編程中一個很普通的概念,通常由三個基本的繪圖組件組成:
Canvas 提供了繪圖方法,可以向底層的位圖繪制基本圖形。
Paint 也稱為"刷子",Paint可以指定如何將基本圖形繪制到位圖上。
Bitmap 繪圖的表面。
這一章中描述的大部分高級技術都涉及到了對Paint對象的變化和修改,從而可以向那些平面的光柵圖片添加深度和紋理。
Android繪圖API支持透明度、漸變填充、圓邊矩形和抗鋸齒。遺憾的是,由于資源限制,它還不支持矢量圖形,它使用的是傳統光柵樣式的重新繪圖。
這種光柵方法的結果是提高了效率,但是改變一個Paint對象不會影響已經畫好的基本圖形,它只會影響新的元素。
提示:
如果你擁有Windows開發背景,那么Android的2D繪圖能力大致相當于GDI+的能力。
1. 可以畫什么?
Canvas類封裝了用作繪圖表面的位圖;它還提供了draw*方法來實現設計。
下面的列表提供了對可用的基本圖形的簡要說明,但并沒有深入地探討每一個draw方法的詳細內容:
drawARGB / drawRGB / drawColor 使用單一的顏色填充畫布。
drawArc 在一個矩形區域的兩個角之間繪制一個弧。
drawBitmap 在畫布上繪制一個位圖??梢酝ㄟ^指定目標大小或者使用一個矩陣來改變目標位圖的外觀。
drawBitmapMesh 使用一個mesh(網)來繪制一個位圖,它可以通過移動網中的點來操作目標的外觀。
drawCircle 以給定的點為圓心,繪制一個指定半徑的圓。
drawLine(s) 在兩個點之間畫一條(多條)直線。
drawOval 以指定的矩形為邊界,畫一個橢圓。
drawPaint 使用指定的Paint填充整個Canvas
drawPath 繪制指定的Path。Path對象經常用來保存一個對象中基本圖形的集合。
drawPicture 在指定的矩形中繪制一個Picture對象。
drawPosText 繪制指定了每一個字符的偏移量的文本字符串。
drawRect 繪制一個矩形。
drawRoundRect 繪制一個圓角矩形。
drawText 在Canvas上繪制一個文本串。文本的字體、大小和渲染屬性都設置在用來渲染文本的Paint對象中。
drawTextOnPath 在一個指定的path上繪制文本。
drawVertices 繪制一系列三角形面片,通過一系列頂點來指定它們。
這些繪圖方法中的每一個都需要指定一個Paint對象來渲染它。在下面的部分中,將學習如何創建和修改Paint對象,從而在繪圖中完成大部分工作。
2. 從Paint中完成工作
Paint類相當于一個筆刷和調色板。它可以選擇如何使用上面描述的draw方法來渲染繪制在畫布上的基本圖形。通過修改Paint對象,可以在繪 圖的時候控制顏色、樣式、字體和特殊效果。最簡單地,setColor可以讓你選擇一個Paint的顏色,而Paint對象的樣式(使用setStyle 控制)則可以決定是繪制繪圖對象的輪廓(STROKE),還是只填充每一部分(FILL),或者是兩者都做(STROKE_AND_FILL)
除了這些簡單的控制之外,Paint類還支持透明度,另外,它也可以通過使用各種各樣的陰影、過濾器和效果進行修改,從而提供由更豐富的、復雜的畫筆和顏料組成的調色板。
Android SDK包含了一些非常好的實例,它們說明了Paint類中可用的大部分功能。你可以在API demos的graphics子目錄中找到它們:
- [sdk root folder]\samples\ApiDemos\src\com\android\samples\graphics
在下面的部分中,將學習和使用其中的部分功能。這些部分只是簡單地羅列了它們能實現的效果(例如漸變和邊緣浮雕),而沒有詳細地列出所有可能的情況。
使用透明度
Android中的所有顏色都包含了一個不透明組件(alpha通道)。
當創建一個顏色的時候,可以使用argb或者parseColor方法來定義它的alpha值,如下所示:
- // 使用紅色,并讓它50%透明
- int opacity = 127;
- int intColor = Color.argb(opacity, 255, 0, 0);
- int parsedColor = Color.parseColor("#7FFF0000");
或者,也可以使用setAlpha方法來設置已存在的Paint對象的透明度:
- // 讓顏色50%透明
- int opacity = 127;
- myPaint.setAlpha(opacity);
創建一個不是100%透明的顏色意味著,使用它繪制的任何基本圖形都將是部分透明的--也就是說,在它下面繪制的所有基本圖形都是部分可見的。
可以在任何使用了顏色的類或者方法中使用透明效果,包括Paint、Shader和Mask Filter。
Shader介紹
Shader類的派生類可以創建允許使用多種固體顏色填充繪圖對象的Paint。
對Shader最常見的使用是定義漸變填充;漸變是在2D圖像中添加深度和紋理的最佳方式之一。Android包含了一個Bitmap Shader和一個Compose Shader,同時,還包含了三個漸變的Shader。
試圖用語言來描述繪圖的效果本來就是沒有意義的,所以看一下圖11-1就應該可以知道每一種Shader是如何工作的。圖中從左到右依次代表的是LinearGradient、RadialGradient和 SweepGradient.
![]() |
(點擊查看大圖)圖11-1 |