咖啡伴侶

          呆在上海
          posts - 163, comments - 156, trackbacks - 0, articles - 2

          高級(jí)畫布繪圖(1)

          Posted on 2011-07-26 11:14 oathleo 閱讀(343) 評(píng)論(0)  編輯  收藏 所屬分類: Android

          11.4.3  高級(jí)畫布繪圖(1)

          我們已經(jīng)在第4章中介紹了Canvas,在那里,已經(jīng)學(xué)習(xí)了如何創(chuàng)建自己的View。在第7章中也使用了Canvas來為MapView標(biāo)注覆蓋。

          畫布(Canvas)是圖形編程中一個(gè)很普通的概念,通常由三個(gè)基本的繪圖組件組成:

          Canvas  提供了繪圖方法,可以向底層的位圖繪制基本圖形。

          Paint  也稱為"刷子",Paint可以指定如何將基本圖形繪制到位圖上。

          Bitmap  繪圖的表面。

          這一章中描述的大部分高級(jí)技術(shù)都涉及到了對(duì)Paint對(duì)象的變化和修改,從而可以向那些平面的光柵圖片添加深度和紋理。

          Android繪圖API支持透明度、漸變填充、圓邊矩形和抗鋸齒。遺憾的是,由于資源限制,它還不支持矢量圖形,它使用的是傳統(tǒng)光柵樣式的重新繪圖。

          這種光柵方法的結(jié)果是提高了效率,但是改變一個(gè)Paint對(duì)象不會(huì)影響已經(jīng)畫好的基本圖形,它只會(huì)影響新的元素。

          提示:

          如果你擁有Windows開發(fā)背景,那么Android的2D繪圖能力大致相當(dāng)于GDI+的能力。

          1. 可以畫什么?

          Canvas類封裝了用作繪圖表面的位圖;它還提供了draw*方法來實(shí)現(xiàn)設(shè)計(jì)。

          下面的列表提供了對(duì)可用的基本圖形的簡(jiǎn)要說明,但并沒有深入地探討每一個(gè)draw方法的詳細(xì)內(nèi)容:

          drawARGB / drawRGB / drawColor  使用單一的顏色填充畫布。

          drawArc  在一個(gè)矩形區(qū)域的兩個(gè)角之間繪制一個(gè)弧。

          drawBitmap  在畫布上繪制一個(gè)位圖。可以通過指定目標(biāo)大小或者使用一個(gè)矩陣來改變目標(biāo)位圖的外觀。

          drawBitmapMesh  使用一個(gè)mesh(網(wǎng))來繪制一個(gè)位圖,它可以通過移動(dòng)網(wǎng)中的點(diǎn)來操作目標(biāo)的外觀。

          drawCircle  以給定的點(diǎn)為圓心,繪制一個(gè)指定半徑的圓。

          drawLine(s)  在兩個(gè)點(diǎn)之間畫一條(多條)直線。

          drawOval  以指定的矩形為邊界,畫一個(gè)橢圓。

          drawPaint  使用指定的Paint填充整個(gè)Canvas

          drawPath  繪制指定的Path。Path對(duì)象經(jīng)常用來保存一個(gè)對(duì)象中基本圖形的集合。

          drawPicture  在指定的矩形中繪制一個(gè)Picture對(duì)象。

          drawPosText  繪制指定了每一個(gè)字符的偏移量的文本字符串。

          drawRect  繪制一個(gè)矩形。

          drawRoundRect  繪制一個(gè)圓角矩形。

          drawText  在Canvas上繪制一個(gè)文本串。文本的字體、大小和渲染屬性都設(shè)置在用來渲染文本的Paint對(duì)象中。

          drawTextOnPath  在一個(gè)指定的path上繪制文本。

          drawVertices  繪制一系列三角形面片,通過一系列頂點(diǎn)來指定它們。

          這些繪圖方法中的每一個(gè)都需要指定一個(gè)Paint對(duì)象來渲染它。在下面的部分中,將學(xué)習(xí)如何創(chuàng)建和修改Paint對(duì)象,從而在繪圖中完成大部分工作。

          2. 從Paint中完成工作

          Paint類相當(dāng)于一個(gè)筆刷和調(diào)色板。它可以選擇如何使用上面描述的draw方法來渲染繪制在畫布上的基本圖形。通過修改Paint對(duì)象,可以在繪 圖的時(shí)候控制顏色、樣式、字體和特殊效果。最簡(jiǎn)單地,setColor可以讓你選擇一個(gè)Paint的顏色,而Paint對(duì)象的樣式(使用setStyle 控制)則可以決定是繪制繪圖對(duì)象的輪廓(STROKE),還是只填充每一部分(FILL),或者是兩者都做(STROKE_AND_FILL)

          除了這些簡(jiǎn)單的控制之外,Paint類還支持透明度,另外,它也可以通過使用各種各樣的陰影、過濾器和效果進(jìn)行修改,從而提供由更豐富的、復(fù)雜的畫筆和顏料組成的調(diào)色板。

          Android SDK包含了一些非常好的實(shí)例,它們說明了Paint類中可用的大部分功能。你可以在API demos的graphics子目錄中找到它們:

          1. [sdk root folder]\samples\ApiDemos\src\com\android\samples\graphics 

          在下面的部分中,將學(xué)習(xí)和使用其中的部分功能。這些部分只是簡(jiǎn)單地羅列了它們能實(shí)現(xiàn)的效果(例如漸變和邊緣浮雕),而沒有詳細(xì)地列出所有可能的情況。

          使用透明度

          Android中的所有顏色都包含了一個(gè)不透明組件(alpha通道)。

          當(dāng)創(chuàng)建一個(gè)顏色的時(shí)候,可以使用argb或者parseColor方法來定義它的alpha值,如下所示:

          1. // 使用紅色,并讓它50%透明  
          2. int opacity = 127;  
          3. int intColor = Color.argb(opacity, 255, 0, 0);  
          4. int parsedColor = Color.parseColor("#7FFF0000"); 

          或者,也可以使用setAlpha方法來設(shè)置已存在的Paint對(duì)象的透明度:

          1. // 讓顏色50%透明  
          2. int opacity = 127;  
          3. myPaint.setAlpha(opacity); 

          創(chuàng)建一個(gè)不是100%透明的顏色意味著,使用它繪制的任何基本圖形都將是部分透明的--也就是說,在它下面繪制的所有基本圖形都是部分可見的。

          可以在任何使用了顏色的類或者方法中使用透明效果,包括Paint、Shader和Mask Filter。

          Shader介紹

          Shader類的派生類可以創(chuàng)建允許使用多種固體顏色填充繪圖對(duì)象的Paint。

          對(duì)Shader最常見的使用是定義漸變填充;漸變是在2D圖像中添加深度和紋理的最佳方式之一。Android包含了一個(gè)Bitmap Shader和一個(gè)Compose Shader,同時(shí),還包含了三個(gè)漸變的Shader。

          試圖用語(yǔ)言來描述繪圖的效果本來就是沒有意義的,所以看一下圖11-1就應(yīng)該可以知道每一種Shader是如何工作的。圖中從左到右依次代表的是LinearGradient、RadialGradient和 SweepGradient.

           
          (點(diǎn)擊查看大圖)圖11-1
          主站蜘蛛池模板: 定州市| 莱芜市| 大名县| 利辛县| 津南区| 石林| 绥芬河市| 沙田区| 新闻| 永川市| 南阳市| 连平县| 崇左市| 鹤山市| 沙河市| 新乡市| 济阳县| 瑞昌市| 嘉义县| 福泉市| 长泰县| 榆林市| 雅安市| 黑山县| 仪陇县| 萝北县| 西畴县| 新晃| 台安县| 江陵县| 马山县| 遵化市| 新安县| 广州市| 花莲市| 重庆市| 镇康县| 望城县| 芜湖县| 哈尔滨市| 密云县|