咖啡伴侶

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

          高級畫布繪圖(3)

          Posted on 2011-07-26 11:35 oathleo 閱讀(443) 評論(0)  編輯  收藏 所屬分類: Android
          高級畫布繪圖(3)

          DashPathEffect  可以使用DashPathEffect來創建一個虛線的輪廓(短橫線/小圓點),而不是使用實線。你還可以指定任意的虛/實線段的重復模式。

          DiscretePathEffect  與DashPathEffect相似,但是添加了隨機性。當繪制它的時候,需要指定每一段的長度和與原始路徑的偏離度。

          PathDashPathEffect  這種效果可以定義一個新的形狀(路徑)并將其用作原始路徑的輪廓標記。

          下面的效果可以在一個Paint中組合使用多個Path Effect。

          SumPathEffect  順序地在一條路徑中添加兩種效果,這樣每一種效果都可以應用到原始路徑中,而且兩種結果可以結合起來。

          ComposePathEffect  將兩種效果組合起來應用,先使用第一種效果,然后在這種效果的基礎上應用第二種效果。

          對象形狀的PathEffect的改變會影響到形狀的區域。這就能夠保證應用到相同形狀的填充效果將會繪制到新的邊界中。

          使用setPathEffect方法可以把PathEffect應用到Paint對象中,如下所示:

          1. borderPaint.setPathEffect(new CornerPathEffect(5)); 

          PathEffect API示例給出了如何應用每一種效果的指導說明。

          修改Xfermode

          可以通過修改Paint的Xfermode來影響在Canvas已有的圖像上面繪制新的顏色的方式。

          在正常的情況下,在已有的圖像上繪圖將會在其上面添加一層新的形狀。如果新的Paint是完全不透明的,那么它將完全遮擋住下面的Paint;如果它是部分透明的,那么它將會被染上下面的顏色。

          下面的Xfermode子類可以改變這種行為:

          AvoidXfermode  指定了一個顏色和容差,強制Paint避免在它上面繪圖(或者只在它上面繪圖)。

          PixelXorXfermode  當覆蓋已有的顏色時,應用一個簡單的像素XOR操作。

          PorterDuffXfermode  這是一個非常強大的轉換模式,使用它,可以使用圖像合成的16條Porter-Duff規則的任意一條來控制Paint如何與已有的Canvas圖像進行交互。

          要應用轉換模式,可以使用setXferMode方法,如下所示:

          1. AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID);  
          2. borderPen.setXfermode(avoid); 

          3. 使用抗鋸齒效果提高Paint質量

          在繪制一個新的Paint對象時,可以通過傳遞給它一些標記來影響它被渲染的方式。ANTI_ALIAS_FLAG是其中一種很有趣的標記,它可以保證在繪制斜線的時候使用抗鋸齒效果來平滑該斜線的外觀。

          在繪制文本的時候,抗鋸齒效果尤為重要,因為經過抗鋸齒效果處理之后的文本非常容易閱讀。要創建更加平滑的文本效果,可以應用SUBPIXEL_TEXT_FLAG,它將會應用子像素抗鋸齒效果。

          也可以手工地使用setSubpixelText和setAntiAlias方法來設置這些標記,如下所示:

          1. myPaint.setSubpixelText(true);  
          2. myPaint.setAntiAlias(true); 

          4. 2D圖形的硬件加速

          在當前這個到處都是2D圖形愛好者的時代,Android允許你使用硬件加速來渲染你的應用程序。

          如果設備可以使用硬件加速,那么通過設置這個標記可以讓活動中的每一個View都能使用硬件渲染。盡管減少了系統處理程序的負載,但在極大地提高了圖像處理速度的同時,硬件加速也帶來了相應的負面效果。

          使用requestWindowFeature方法,可以在你的活動中應用Window.FEATURE_OPENGL標記來打開硬件加速,如下所示:

          1. myActivity.requestWindowFeature(Window.FEATURE_OPENGL); 

          遺憾的是,天上不會掉餡餅,這次也不例外。

          并不是Android中所有的2D繪圖基本圖形都被硬件支持(特別是前面描述的大部分PathEffect)。

          與此同時,由于整個活動實際上是作為一個Canvas進行渲染的,所以對任何View的無效請求都將會導致整個活動被重新繪制。

          5. Canvas繪圖最佳實踐經驗

          2D自繪操作是非常耗費處理程序資源的;低效的繪圖方法會阻塞GUI線程,并且會對應用程序的響應造成不利的影響。對于那些只有一個處理程序的資源受限的環境來說,這一點就更加現實了。

          這里需要注意onDraw方法的資源消耗以及CPU周期的耗費,這樣才能保證不會把一個看起來很吸引人的應用程序變得完全沒有響應。

          目前有很多技術可以幫助將與自繪控件相關的資源消耗最小化。我們關心的不是一般的原則,而是某些Android特定的注意事項,從而保證你可以創建外觀時尚、而且能夠保持交互的活動(注意,以下這個列表并不完整):

          考慮硬件加速  OpenGL硬件加速對2D圖形的支持是非常好的,所以你總是應該考慮它是否適合你的活動。另一種比較優秀的方法是只用一個單獨的View和迅速的、耗時的更新來組成活動。一定要保證你使用的基本圖形能夠被硬件支持。

          考慮大小和方向  當在設計View和布局的時候,一定要保證考慮(和測試)它們在不同的分辨率和大小下的外觀。

          只創建一次靜態對象  在Android中對象的創建是相當昂貴的。因此,在可能的地方,應用只創建一次像Paint對象、Path和Shader這樣的繪圖對象,而不是在View每次無效的時候都重新創建它們。

          記住onDraw是很消耗資源的  執行onDraw方法是很消耗資源的處理,它會強制Android執行多個圖片組合和位圖構建操作。下面有幾點建議可以讓你修改Canvas的外觀,而不用重新繪制它:

          使用Canvas轉換  可以使用像rotate和translate這樣的轉換,來簡化Canvas中元素復雜的相關位置。例如,相比放置和旋轉一個表盤周圍的每一個文本元素,你可以簡單地將canvas旋轉22.5?,然后在相同的位置繪制文本。

          使用動畫  可以考慮使用動畫來執行View的預設置的轉換,而不是手動地重新繪制它。在活動的View中可以執行縮放、旋轉和轉換動畫,并可以提供一種能夠有效利用資源的方式來提供縮放、旋轉或者抖動效果。

          考慮使用位圖和9 Patch  如果View使用了靜態背景,那么你應該考慮使用一個圖片,如位圖或者9 patch,而不是手動地重新繪制。

          主站蜘蛛池模板: 佛坪县| 库尔勒市| 五大连池市| 中江县| 嘉禾县| 牡丹江市| 旌德县| 邹平县| 桐庐县| 广平县| 罗平县| 陇南市| 东兴市| 永康市| 双江| 临武县| 特克斯县| 武夷山市| 文成县| 桂阳县| 长武县| 门头沟区| 蕉岭县| 三江| 安达市| 沅陵县| 富平县| 手游| 饶河县| 玛纳斯县| 宝坻区| 新巴尔虎右旗| 定结县| 三穗县| 凤冈县| 忻城县| 大余县| 大同县| 射洪县| 扶绥县| 龙井市|