在Paint中有很多的屬性可以設置,比如可以設置陰影,顏色過濾等等,這些會產生不同的奇妙效果,今天就對各種屬性探索一下。
方法一:
1 // 設置繪制的顏色,a代表透明度,r,g,b代表顏色值。 2 setARGB( int a, int r, int g, int b);
這個不多說了,還有兩個類似的方法,將設置alpha和rgb分割開來了。注意的是這里的a值是0~255的范圍,不是小數。
方法二:
// 設置是否使用抗鋸齒功能,會消耗較大資源,繪制圖形速度會變慢。 setAntiAlias( boolean aa);
也不多說,你可以試驗一下效果,設置后會平滑一些;
方法三:
1 // 設定是否使用圖像抖動處理,會使繪制出來的圖片顏色更加平滑和飽滿,圖像更加清晰 2 setDither( boolean dither);
方法四:
1 // 設置MaskFilter,可以用不同的MaskFilter實現濾鏡的效果,如濾化,立體等 2 setMaskFilter(MaskFilter maskfilter);
MaskFilter類可以為Paint分配邊緣效果。
對MaskFilter的擴展可以對一個Paint邊緣的alpha通道應用轉換。Android包含了下面幾種MaskFilter:
BlurMaskFilter???指定了一個模糊的樣式和半徑來處理Paint的邊緣。
EmbossMaskFilter??指定了光源的方向和環境光強度來添加浮雕效果。
要應用一個MaskFilter,可以使用setMaskFilter方法,并傳遞給它一個MaskFilter對象。下面的例子是對一個已經存在的Paint應用一個EmbossMaskFilter:
1 // 設置光源的方向 2 float [] direction = new float []{ 1, 1, 1 }; 3 4 // 設置環境光亮度 5 float light = 0.4f ; 6 7 // 選擇要應用的反射等級 8 float specular = 6 ; 9 10 // 向mask應用一定級別的模糊 11 float blur = 3.5f ; 12 13 EmbossMaskFilter emboss= new EmbossMaskFilter(direction,light,specular,blur); 14 15 // 應用mask 16 myPaint.setMaskFilter(emboss);
可以看一下下面的圖,是不是有浮雕的效果??
再看下面使用BlurMaskFilter:
1 // 前面一個控制陰影的寬度,后面一個參數控制陰影效果 2 maskFilter = new BlurMaskFilter(10, BlurMaskFilter.Blur.SOLID);
是不是有陰影效果呢??
方法五:
1 // 設置顏色過濾器,可以在繪制顏色時實現不用顏色的變換效果 2 setColorFilter(ColorFilter colorfilter);
這個方法也值得試驗一下:
MaskFilter是對一個Paint的alpha通道的轉換,而ColorFilter則是對每一個RGB通道應用轉換。所有由ColorFilter所派生的類在執行它們的轉換時,都會忽略alpha通道。
這個貌似比較麻煩,改天再說。
方法六:
1 // 設置繪制路徑的效果,如點畫線等 2 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對象中,如下所示:
1 paint.setPathEffect( new CornerPathEffect(10));
其他效果懶得測試了,這個在模擬器上跑的時候效果也不明顯,但是真機上跑的時候的確圓滑了許多,看上去很舒服
方法七:
1 // 設置圖形重疊時的處理方式,如合并,取交集或并集,經常用來制作橡皮的擦除效果 2 setXfermode(Xfermode xfermode);
橡皮擦,這是個好方法啊,看看。
可以通過修改Paint的Xfermode來影響在Canvas已有的圖像上面繪制新的顏色的方式。
在正常的情況下,在已有的圖像上繪圖將會在其上面添加一層新的形狀。如果新的Paint是完全不透明的,那么它將完全遮擋住下面的Paint;如果它是部分透明的,那么它將會被染上下面的顏色。下面的Xfermode子類可以改變這種行為:
1)AvoidXfermode??指定了一個顏色和容差,強制Paint避免在它上面繪圖(或者只在它上面繪圖)。
2)PixelXorXfermode??當覆蓋已有的顏色時,應用一個簡單的像素XOR操作。
3)PorterDuffXfermode??這是一個非常強大的轉換模式,使用它,可以使用圖像合成的16條Porter-Duff規則的任意一條來控制Paint如何與已有的Canvas圖像進行交互。
要應用轉換模式,可以使用setXferMode方法,如下所示:
?
1 AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10 , AvoidXfermode.Mode. AVOID); 2 borderPen.setXfermode(avoid);
這里可以實現完美的橡皮擦功能!代碼異常簡單:
1 Xfermode xFermode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR); 2 paint.setXfermode(xFermode);
這是使用的最后一個子類,關于16條Porter-Duff規則,如下:
1 private static final Xfermode[] sModes = { 2 new PorterDuffXfermode(PorterDuff.Mode.CLEAR), 3 new PorterDuffXfermode(PorterDuff.Mode.SRC), 4 new PorterDuffXfermode(PorterDuff.Mode.DST), 5 new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER), 6 new PorterDuffXfermode(PorterDuff.Mode.DST_OVER), 7 new PorterDuffXfermode(PorterDuff.Mode.SRC_IN), 8 new PorterDuffXfermode(PorterDuff.Mode.DST_IN), 9 new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT), 10 new PorterDuffXfermode(PorterDuff.Mode.DST_OUT), 11 new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP), 12 new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP), 13 new PorterDuffXfermode(PorterDuff.Mode.XOR), 14 new PorterDuffXfermode(PorterDuff.Mode.DARKEN), 15 new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN), 16 new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY), 17 new PorterDuffXfermode(PorterDuff.Mode.SCREEN) 18 };
它們每個顯示的效果具體如下:
第一個就是Clear效果!
上面很多的圖都是由SDK APIDemos運行所得~~有時間仔細研究一下Graphics中的每個Activity。
?
?
/** * Paint類介紹 * * Paint即畫筆,在繪圖過程中起到了極其重要的作用,畫筆主要保存了顏色, * 樣式等繪制信息,指定了如何繪制文本和圖形,畫筆對象有很多設置方法, * 大體上可以分為兩類,一類與圖形繪制相關,一類與文本繪制相關。 * * 1.圖形繪制 * setARGB(int a,int r,int g,int b); * 設置繪制的顏色,a代表透明度,r,g,b代表顏色值。 * * setAlpha(int a); * 設置繪制圖形的透明度。 * * setColor(int color); * 設置繪制的顏色,使用顏色值來表示,該顏色值包括透明度和RGB顏色。 * * setAntiAlias(boolean aa); * 設置是否使用抗鋸齒功能,會消耗較大資源,繪制圖形速度會變慢。 * * setDither(boolean dither); * 設定是否使用圖像抖動處理,會使繪制出來的圖片顏色更加平滑和飽滿,圖像更加清晰 * * setFilterBitmap(boolean filter); * 如果該項設置為true,則圖像在動畫進行中會濾掉對Bitmap圖像的優化操作,加快顯示 * 速度,本設置項依賴于dither和xfermode的設置 * * setMaskFilter(MaskFilter maskfilter); * 設置MaskFilter,可以用不同的MaskFilter實現濾鏡的效果,如濾化,立體等 * * setColorFilter(ColorFilter colorfilter); * 設置顏色過濾器,可以在繪制顏色時實現不用顏色的變換效果 * * setPathEffect(PathEffect effect); * 設置繪制路徑的效果,如點畫線等 * * setShader(Shader shader); * 設置圖像效果,使用Shader可以繪制出各種漸變效果 * * setShadowLayer(float radius ,float dx,float dy,int color); * 在圖形下面設置陰影層,產生陰影效果,radius為陰影的角度,dx和dy為陰影在x軸和y軸上的距離,color為陰影的顏色 * * setStyle(Paint.Style style); * 設置畫筆的樣式,為FILL,FILL_OR_STROKE,或STROKE * * setStrokeCap(Paint.Cap cap); * 當畫筆樣式為STROKE或FILL_OR_STROKE時,設置筆刷的圖形樣式,如圓形樣式 * Cap.ROUND,或方形樣式Cap.SQUARE * * setSrokeJoin(Paint.Join join); * 設置繪制時各圖形的結合方式,如平滑效果等 * * setStrokeWidth(float width); * 當畫筆樣式為STROKE或FILL_OR_STROKE時,設置筆刷的粗細度 * * setXfermode(Xfermode xfermode); * 設置圖形重疊時的處理方式,如合并,取交集或并集,經常用來制作橡皮的擦除效果 * * 2.文本繪制 * setFakeBoldText(boolean fakeBoldText); * 模擬實現粗體文字,設置在小字體上效果會非常差 * * setSubpixelText(boolean subpixelText); * 設置該項為true,將有助于文本在LCD屏幕上的顯示效果 * * setTextAlign(Paint.Align align); * 設置繪制文字的對齊方向 * * setTextScaleX(float scaleX); * 設置繪制文字x軸的縮放比例,可以實現文字的拉伸的效果 * * setTextSize(float textSize); * 設置繪制文字的字號大小 * * setTextSkewX(float skewX); * 設置斜體文字,skewX為傾斜弧度 * * setTypeface(Typeface typeface); * 設置Typeface對象,即字體風格,包括粗體,斜體以及襯線體,非襯線體等 * * setUnderlineText(boolean underlineText); * 設置帶有下劃線的文字效果 * * setStrikeThruText(boolean strikeThruText); * 設置帶有刪除線的效果 * */
?
private class MyView2 extends View { public MyView2(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.WHITE); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE);//設置為空心 paint.setStrokeWidth(3); canvas.drawCircle(40, 40, 30, paint); canvas.drawRect(10, 90, 70, 150, paint); canvas.drawRect(10, 170, 70, 200, paint); canvas.drawOval(new RectF(10, 220, 70, 250), paint); Path path = new Path();//三角形 path.moveTo(10, 330); path.lineTo(70, 330); path.lineTo(40, 270); path.close(); canvas.drawPath(path, paint); Path path1 = new Path();//梯形 path1.moveTo(10, 410);//繪畫基點 path1.lineTo(70, 410); path1.lineTo(55, 350); path1.lineTo(25, 350); path1.close();//把開始的點和最后的點連接在一起,構成一個封閉圖形 /* * 最重要的就是movtTo和close,如果是Style.FILL的話,不設置close,也沒有區別,可是如果是STROKE模式, * 如果不設置close,圖形不封閉。 * * 當然,你也可以不設置close,再添加一條線,效果一樣。 */ canvas.drawPath(path1, paint); ///////////////////////////////////////第二列 paint.setColor(Color.BLUE); paint.setStyle(Paint.Style.FILL);//設置實心 canvas.drawCircle(120, 40, 30, paint); canvas.drawRect(90, 90, 150, 150, paint); canvas.drawRect(90, 170, 150, 200, paint); RectF re2 = new RectF(90, 220, 150, 250); canvas.drawOval(re2, paint); Path path2 = new Path(); path2.moveTo(90, 330); path2.lineTo(150, 330); path2.lineTo(120, 270); path2.close(); canvas.drawPath(path2, paint); Path path3 = new Path(); path3.moveTo(90, 410); path3.lineTo(150, 410); path3.lineTo(135, 350); path3.lineTo(105, 350); path3.close(); canvas.drawPath(path3, paint); ////////////////////////////////////////////////////第三列 /* * LinearGradient shader = new LinearGradient(0, 0, endX, endY, new * int[]{startColor, midleColor, endColor},new float[]{0 , 0.5f, * 1.0f}, TileMode.MIRROR); * 參數一為漸變起初點坐標x位置,參數二為y軸位置,參數三和四分辨對應漸變終點 * 其中參數new int[]{startColor, midleColor,endColor}是參與漸變效果的顏色集合, * 其中參數new float[]{0 , 0.5f, 1.0f}是定義每個顏色處于的漸變相對位置, 這個參數可以為null,如果為null表示所有的顏色按順序均勻的分布 */ Shader mShader = new LinearGradient(0, 0, 100, 100, new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW }, null, Shader.TileMode.REPEAT); // Shader.TileMode三種模式 // REPEAT:沿著漸變方向循環重復 // CLAMP:如果在預先定義的范圍外畫的話,就重復邊界的顏色 // MIRROR:與REPEAT一樣都是循環重復,但這個會對稱重復 paint.setShader(mShader);// 用Shader中定義定義的顏色來話 canvas.drawCircle(200, 40, 30, paint); canvas.drawRect(170, 90, 230, 150, paint); canvas.drawRect(170, 170, 230, 200, paint); RectF re3 = new RectF(170, 220, 230, 250); canvas.drawOval(re3, paint); Path path4 = new Path(); path4.moveTo(170, 330); path4.lineTo(230, 330); path4.lineTo(200, 270); path4.close(); canvas.drawPath(path4, paint); Path path5 = new Path(); path5.moveTo(170, 410); path5.lineTo(230, 410); path5.lineTo(215, 350); path5.lineTo(185, 350); path5.close(); canvas.drawPath(path5, paint); //////////////////////////////////第4列 paint.setTextSize(24); canvas.drawText("圓形", 240, 50, paint); canvas.drawText("正方形", 240, 120, paint); canvas.drawText("長方形", 240, 190, paint); canvas.drawText("橢圓形", 240, 250, paint); canvas.drawText("三角形", 240, 320, paint); canvas.drawText("梯形", 240, 390, paint); } }
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
