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 |