咖啡伴侶

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

          高級畫布繪圖(1)

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

          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子目錄中找到它們:

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

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

          使用透明度

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

          當創建一個顏色的時候,可以使用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方法來設置已存在的Paint對象的透明度:

          1. // 讓顏色50%透明  
          2. int opacity = 127;  
          3. 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
          主站蜘蛛池模板: 海阳市| 中宁县| 普洱| 望谟县| 惠安县| 德保县| 策勒县| 灵璧县| 怀远县| 德清县| 克东县| 临夏市| 内乡县| 兴城市| 曲水县| 五大连池市| 湖州市| 皋兰县| 普陀区| 福贡县| 沙河市| 尼木县| 禹州市| 马公市| 汶上县| 南溪县| 梅河口市| 潮安县| 新营市| 阜城县| 泰宁县| 句容市| 兰考县| 黎川县| 禹州市| 丽水市| 基隆市| 道孚县| 应城市| 磐石市| 呈贡县|