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