android 繪圖之Paint的效果研究

AltSyb 8年前發布 | 8K 次閱讀 Android開發 移動開發

在Paint中有很多的屬性可以設置,比如可以設置陰影,顏色過濾等等,這些會產生不同的奇妙效果,今天就對各種屬性探索一下。

方法一:

//設置繪制的顏色,a代表透明度,r,g,b代表顏色值。
setARGB(int a,int r,int g,int b);

這個不多說了,還有兩個類似的方法,將設置alpha和rgb分割開來了。注意的是這里的a值是0~255的范圍,不是小數。

方法二:

設置是否使用抗鋸齒功能,會消耗較大資源,繪制圖形速度會變慢。
setAntiAlias(boolean aa);

也不多說,你可以試驗一下效果,設置后會平滑一些;

方法三:

//設定是否使用圖像抖動處理,會使繪制出來的圖片顏色更加平滑和飽滿,圖像更加清晰
 setDither(boolean dither);

方法四:

//設置MaskFilter,可以用不同的MaskFilter實現濾鏡的效果,如濾化,立體等
setMaskFilter(MaskFilter maskfilter);

MaskFilter類可以為Paint分配邊緣效果。
對MaskFilter的擴展可以對一個Paint邊緣的alpha通道應用轉換。Android包含了下面幾種MaskFilter:
BlurMaskFilter   指定了一個模糊的樣式和半徑來處理Paint的邊緣。
EmbossMaskFilter  指定了光源的方向和環境光強度來添加浮雕效果。
要應用一個MaskFilter,可以使用setMaskFilter方法,并傳遞給它一個MaskFilter對象。下面的例子是對一個已經存在的Paint應用一個EmbossMaskFilter:

// 設置光源的方向
float[] direction = new float[]{ 1, 1, 1 };
//設置環境光亮度
float light = 0.4f;
// 選擇要應用的反射等級
float specular = 6;
// 向mask應用一定級別的模糊
float blur = 3.5f;
EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);
// 應用mask
myPaint.setMaskFilter(emboss);

可以看一下下面的圖,是不是有浮雕的效果??

再看下面使用BlurMaskFilter:

//前面一個控制陰影的寬度,后面一個參數控制陰影效果
maskFilter = new BlurMaskFilter(10, BlurMaskFilter.Blur.SOLID);

是不是有陰影效果呢??

方法五:

//設置顏色過濾器,可以在繪制顏色時實現不用顏色的變換效果
setColorFilter(ColorFilter colorfilter);

這個方法也值得試驗一下:

MaskFilter是對一個Paint的alpha通道的轉換,而ColorFilter則是對每一個RGB通道應用轉換。所有由ColorFilter所派生的類在執行它們的轉換時,都會忽略alpha通道。

這個貌似比較麻煩,改天再說。

方法六:

//設置繪制路徑的效果,如點畫線等
setPathEffect(PathEffect effect);

又是一個很好玩的方法:

到目前為止,所有的效應都會影響到Paint填充圖像的方式;PathEffect是用來控制繪制輪廓(線條)的方式。PathEffect對于繪制Path基本圖形特別有用,但是它們也可以應用到任何Paint中從而影響線條繪制的方式。
使用PathEffect,可以改變一個形狀的邊角的外觀并且控制輪廓的外表。Android包含了多個PathEffect,包括:
1)CornerPathEffect  可以使用圓角來代替尖銳的角從而對基本圖形的形狀尖銳的邊角進行平滑。

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

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

4)PathDashPathEffect  這種效果可以定義一個新的形狀(路徑)并將其用作原始路徑的輪廓標記。
下面的效果可以在一個Paint中組合使用多個Path Effect。
1)SumPathEffect 順序地在一條路徑中添加兩種效果,這樣每一種效果都可以應用到原始路徑中,而且兩種結果可以結合起來。
2)ComposePathEffect  將兩種效果組合起來應用,先使用第一種效果,然后在這種效果的基礎上應用第二種效果。
對象形狀的PathEffect的改變會影響到形狀的區域。這就能夠保證應用到相同形狀的填充效果將會繪制到新的邊界中。
使用setPathEffect方法可以把PathEffect應用到Paint對象中,如下所示:

paint.setPathEffect(new CornerPathEffect(10));

其他效果懶得測試了,這個在模擬器上跑的時候效果也不明顯,但是真機上跑的時候的確圓滑了許多,看上去很舒服

方法七:

//設置圖形重疊時的處理方式,如合并,取交集或并集,經常用來制作橡皮的擦除效果
setXfermode(Xfermode xfermode);

橡皮擦,這是個好方法啊,看看。

可以通過修改Paint的Xfermode來影響在Canvas已有的圖像上面繪制新的顏色的方式。
在正常的情況下,在已有的圖像上繪圖將會在其上面添加一層新的形狀。如果新的Paint是完全不透明的,那么它將完全遮擋住下面的Paint;如果它是部分透明的,那么它將會被染上下面的顏色。下面的Xfermode子類可以改變這種行為:
1)AvoidXfermode  指定了一個顏色和容差,強制Paint避免在它上面繪圖(或者只在它上面繪圖)。
2)PixelXorXfermode  當覆蓋已有的顏色時,應用一個簡單的像素XOR操作。
3)PorterDuffXfermode  這是一個非常強大的轉換模式,使用它,可以使用圖像合成的16條Porter-Duff規則的任意一條來控制Paint如何與已有的Canvas圖像進行交互。
要應用轉換模式,可以使用setXferMode方法,如下所示:

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

這里可以實現完美的橡皮擦功能!代碼異常簡單:

Xfermode xFermode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
paint.setXfermode(xFermode);

這是使用的最后一個子類,關于16條Porter-Duff規則,如下:

private static final Xfermode[] sModes = {
            new PorterDuffXfermode(PorterDuff.Mode.CLEAR),
            new PorterDuffXfermode(PorterDuff.Mode.SRC),
            new PorterDuffXfermode(PorterDuff.Mode.DST),
            new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),
            new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),
            new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),
            new PorterDuffXfermode(PorterDuff.Mode.DST_IN),
            new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),
            new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),
            new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),
            new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),
            new PorterDuffXfermode(PorterDuff.Mode.XOR),
            new PorterDuffXfermode(PorterDuff.Mode.DARKEN),
            new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),
            new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),
            new PorterDuffXfermode(PorterDuff.Mode.SCREEN)
        };

它們每個顯示的效果具體如下:

第一個就是Clear效果!

上面很多的圖都是由SDK APIDemos運行所得~~有時間仔細研究一下Graphics中的每個Activity。

 

 本文由用戶 AltSyb 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!