在Paint中有很多的屬性可以設(shè)置,比如可以設(shè)置陰影,顏色過(guò)濾等等,這些會(huì)產(chǎn)生不同的奇妙效果,今天就對(duì)各種屬性探索一下。
方法一:
1 // 設(shè)置繪制的顏色,a代表透明度,r,g,b代表顏色值。 2 setARGB( int a, int r, int g, int b);
這個(gè)不多說(shuō)了,還有兩個(gè)類似的方法,將設(shè)置alpha和rgb分割開(kāi)來(lái)了。注意的是這里的a值是0~255的范圍,不是小數(shù)。
方法二:
// 設(shè)置是否使用抗鋸齒功能,會(huì)消耗較大資源,繪制圖形速度會(huì)變慢。 setAntiAlias( boolean aa);
也不多說(shuō),你可以試驗(yàn)一下效果,設(shè)置后會(huì)平滑一些;
方法三:
1 // 設(shè)定是否使用圖像抖動(dòng)處理,會(huì)使繪制出來(lái)的圖片顏色更加平滑和飽滿,圖像更加清晰 2 setDither( boolean dither);
方法四:
1 // 設(shè)置MaskFilter,可以用不同的MaskFilter實(shí)現(xiàn)濾鏡的效果,如濾化,立體等 2 setMaskFilter(MaskFilter maskfilter);
MaskFilter類可以為Paint分配邊緣效果。
對(duì)MaskFilter的擴(kuò)展可以對(duì)一個(gè)Paint邊緣的alpha通道應(yīng)用轉(zhuǎn)換。Android包含了下面幾種MaskFilter:
BlurMaskFilter???指定了一個(gè)模糊的樣式和半徑來(lái)處理Paint的邊緣。
EmbossMaskFilter??指定了光源的方向和環(huán)境光強(qiáng)度來(lái)添加浮雕效果。
要應(yīng)用一個(gè)MaskFilter,可以使用setMaskFilter方法,并傳遞給它一個(gè)MaskFilter對(duì)象。下面的例子是對(duì)一個(gè)已經(jīng)存在的Paint應(yīng)用一個(gè)EmbossMaskFilter:
1 // 設(shè)置光源的方向 2 float [] direction = new float []{ 1, 1, 1 }; 3 4 // 設(shè)置環(huán)境光亮度 5 float light = 0.4f ; 6 7 // 選擇要應(yīng)用的反射等級(jí) 8 float specular = 6 ; 9 10 // 向mask應(yīng)用一定級(jí)別的模糊 11 float blur = 3.5f ; 12 13 EmbossMaskFilter emboss= new EmbossMaskFilter(direction,light,specular,blur); 14 15 // 應(yīng)用mask 16 myPaint.setMaskFilter(emboss);
可以看一下下面的圖,是不是有浮雕的效果??
再看下面使用BlurMaskFilter:
1 // 前面一個(gè)控制陰影的寬度,后面一個(gè)參數(shù)控制陰影效果 2 maskFilter = new BlurMaskFilter(10, BlurMaskFilter.Blur.SOLID);
是不是有陰影效果呢??
方法五:
1 // 設(shè)置顏色過(guò)濾器,可以在繪制顏色時(shí)實(shí)現(xiàn)不用顏色的變換效果 2 setColorFilter(ColorFilter colorfilter);
這個(gè)方法也值得試驗(yàn)一下:
MaskFilter是對(duì)一個(gè)Paint的alpha通道的轉(zhuǎn)換,而ColorFilter則是對(duì)每一個(gè)RGB通道應(yīng)用轉(zhuǎn)換。所有由ColorFilter所派生的類在執(zhí)行它們的轉(zhuǎn)換時(shí),都會(huì)忽略alpha通道。
這個(gè)貌似比較麻煩,改天再說(shuō)。
方法六:
1 // 設(shè)置繪制路徑的效果,如點(diǎn)畫線等 2 setPathEffect(PathEffect effect);
又是一個(gè)很好玩的方法:
到目前為止,所有的效應(yīng)都會(huì)影響到Paint填充圖像的方式;PathEffect是用來(lái)控制繪制輪廓(線條)的方式。PathEffect對(duì)于繪制Path基本圖形特別有用,但是它們也可以應(yīng)用到任何Paint中從而影響線條繪制的方式。
使用PathEffect,可以改變一個(gè)形狀的邊角的外觀并且控制輪廓的外表。Android包含了多個(gè)PathEffect,包括:
1)CornerPathEffect??可以使用圓角來(lái)代替尖銳的角從而對(duì)基本圖形的形狀尖銳的邊角進(jìn)行平滑。
2)DashPathEffect??可以使用DashPathEffect來(lái)創(chuàng)建一個(gè)虛線的輪廓(短橫線/小圓點(diǎn)),而不是使用實(shí)線。你還可以指定任意的虛/實(shí)線段的重復(fù)模式。
3) DiscretePathEffect??與DashPathEffect相似,但是添加了隨機(jī)性。當(dāng)繪制它的時(shí)候,需要指定每一段的長(zhǎng)度和與原始路徑的偏離度。
4)PathDashPathEffect??這種效果可以定義一個(gè)新的形狀(路徑)并將其用作原始路徑的輪廓標(biāo)記。
下面的效果可以在一個(gè)Paint中組合使用多個(gè)Path Effect。
1)SumPathEffect??順序地在一條路徑中添加兩種效果,這樣每一種效果都可以應(yīng)用到原始路徑中,而且兩種結(jié)果可以結(jié)合起來(lái)。
2)ComposePathEffect??將兩種效果組合起來(lái)應(yīng)用,先使用第一種效果,然后在這種效果的基礎(chǔ)上應(yīng)用第二種效果。
對(duì)象形狀的PathEffect的改變會(huì)影響到形狀的區(qū)域。這就能夠保證應(yīng)用到相同形狀的填充效果將會(huì)繪制到新的邊界中。
使用setPathEffect方法可以把PathEffect應(yīng)用到Paint對(duì)象中,如下所示:
1 paint.setPathEffect( new CornerPathEffect(10));
其他效果懶得測(cè)試了,這個(gè)在模擬器上跑的時(shí)候效果也不明顯,但是真機(jī)上跑的時(shí)候的確圓滑了許多,看上去很舒服
方法七:
1 // 設(shè)置圖形重疊時(shí)的處理方式,如合并,取交集或并集,經(jīng)常用來(lái)制作橡皮的擦除效果 2 setXfermode(Xfermode xfermode);
橡皮擦,這是個(gè)好方法啊,看看。
可以通過(guò)修改Paint的Xfermode來(lái)影響在Canvas已有的圖像上面繪制新的顏色的方式。
在正常的情況下,在已有的圖像上繪圖將會(huì)在其上面添加一層新的形狀。如果新的Paint是完全不透明的,那么它將完全遮擋住下面的Paint;如果它是部分透明的,那么它將會(huì)被染上下面的顏色。下面的Xfermode子類可以改變這種行為:
1)AvoidXfermode??指定了一個(gè)顏色和容差,強(qiáng)制Paint避免在它上面繪圖(或者只在它上面繪圖)。
2)PixelXorXfermode??當(dāng)覆蓋已有的顏色時(shí),應(yīng)用一個(gè)簡(jiǎn)單的像素XOR操作。
3)PorterDuffXfermode??這是一個(gè)非常強(qiáng)大的轉(zhuǎn)換模式,使用它,可以使用圖像合成的16條Porter-Duff規(guī)則的任意一條來(lái)控制Paint如何與已有的Canvas圖像進(jìn)行交互。
要應(yīng)用轉(zhuǎn)換模式,可以使用setXferMode方法,如下所示:
?
1 AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10 , AvoidXfermode.Mode. AVOID); 2 borderPen.setXfermode(avoid);
這里可以實(shí)現(xiàn)完美的橡皮擦功能!代碼異常簡(jiǎn)單:
1 Xfermode xFermode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR); 2 paint.setXfermode(xFermode);
這是使用的最后一個(gè)子類,關(guān)于16條Porter-Duff規(guī)則,如下:
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 };
它們每個(gè)顯示的效果具體如下:
第一個(gè)就是Clear效果!
上面很多的圖都是由SDK APIDemos運(yùn)行所得~~有時(shí)間仔細(xì)研究一下Graphics中的每個(gè)Activity。
?
?
/** * Paint類介紹 * * Paint即畫筆,在繪圖過(guò)程中起到了極其重要的作用,畫筆主要保存了顏色, * 樣式等繪制信息,指定了如何繪制文本和圖形,畫筆對(duì)象有很多設(shè)置方法, * 大體上可以分為兩類,一類與圖形繪制相關(guān),一類與文本繪制相關(guān)。 * * 1.圖形繪制 * setARGB(int a,int r,int g,int b); * 設(shè)置繪制的顏色,a代表透明度,r,g,b代表顏色值。 * * setAlpha(int a); * 設(shè)置繪制圖形的透明度。 * * setColor(int color); * 設(shè)置繪制的顏色,使用顏色值來(lái)表示,該顏色值包括透明度和RGB顏色。 * * setAntiAlias(boolean aa); * 設(shè)置是否使用抗鋸齒功能,會(huì)消耗較大資源,繪制圖形速度會(huì)變慢。 * * setDither(boolean dither); * 設(shè)定是否使用圖像抖動(dòng)處理,會(huì)使繪制出來(lái)的圖片顏色更加平滑和飽滿,圖像更加清晰 * * setFilterBitmap(boolean filter); * 如果該項(xiàng)設(shè)置為true,則圖像在動(dòng)畫進(jìn)行中會(huì)濾掉對(duì)Bitmap圖像的優(yōu)化操作,加快顯示 * 速度,本設(shè)置項(xiàng)依賴于dither和xfermode的設(shè)置 * * setMaskFilter(MaskFilter maskfilter); * 設(shè)置MaskFilter,可以用不同的MaskFilter實(shí)現(xiàn)濾鏡的效果,如濾化,立體等 * * setColorFilter(ColorFilter colorfilter); * 設(shè)置顏色過(guò)濾器,可以在繪制顏色時(shí)實(shí)現(xiàn)不用顏色的變換效果 * * setPathEffect(PathEffect effect); * 設(shè)置繪制路徑的效果,如點(diǎn)畫線等 * * setShader(Shader shader); * 設(shè)置圖像效果,使用Shader可以繪制出各種漸變效果 * * setShadowLayer(float radius ,float dx,float dy,int color); * 在圖形下面設(shè)置陰影層,產(chǎn)生陰影效果,radius為陰影的角度,dx和dy為陰影在x軸和y軸上的距離,color為陰影的顏色 * * setStyle(Paint.Style style); * 設(shè)置畫筆的樣式,為FILL,F(xiàn)ILL_OR_STROKE,或STROKE * * setStrokeCap(Paint.Cap cap); * 當(dāng)畫筆樣式為STROKE或FILL_OR_STROKE時(shí),設(shè)置筆刷的圖形樣式,如圓形樣式 * Cap.ROUND,或方形樣式Cap.SQUARE * * setSrokeJoin(Paint.Join join); * 設(shè)置繪制時(shí)各圖形的結(jié)合方式,如平滑效果等 * * setStrokeWidth(float width); * 當(dāng)畫筆樣式為STROKE或FILL_OR_STROKE時(shí),設(shè)置筆刷的粗細(xì)度 * * setXfermode(Xfermode xfermode); * 設(shè)置圖形重疊時(shí)的處理方式,如合并,取交集或并集,經(jīng)常用來(lái)制作橡皮的擦除效果 * * 2.文本繪制 * setFakeBoldText(boolean fakeBoldText); * 模擬實(shí)現(xiàn)粗體文字,設(shè)置在小字體上效果會(huì)非常差 * * setSubpixelText(boolean subpixelText); * 設(shè)置該項(xiàng)為true,將有助于文本在LCD屏幕上的顯示效果 * * setTextAlign(Paint.Align align); * 設(shè)置繪制文字的對(duì)齊方向 * * setTextScaleX(float scaleX); * 設(shè)置繪制文字x軸的縮放比例,可以實(shí)現(xiàn)文字的拉伸的效果 * * setTextSize(float textSize); * 設(shè)置繪制文字的字號(hào)大小 * * setTextSkewX(float skewX); * 設(shè)置斜體文字,skewX為傾斜弧度 * * setTypeface(Typeface typeface); * 設(shè)置Typeface對(duì)象,即字體風(fēng)格,包括粗體,斜體以及襯線體,非襯線體等 * * setUnderlineText(boolean underlineText); * 設(shè)置帶有下劃線的文字效果 * * setStrikeThruText(boolean strikeThruText); * 設(shè)置帶有刪除線的效果 * */
?
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);//設(shè)置為空心 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);//繪畫基點(diǎn) path1.lineTo(70, 410); path1.lineTo(55, 350); path1.lineTo(25, 350); path1.close();//把開(kāi)始的點(diǎn)和最后的點(diǎn)連接在一起,構(gòu)成一個(gè)封閉圖形 /* * 最重要的就是movtTo和close,如果是Style.FILL的話,不設(shè)置close,也沒(méi)有區(qū)別,可是如果是STROKE模式, * 如果不設(shè)置close,圖形不封閉。 * * 當(dāng)然,你也可以不設(shè)置close,再添加一條線,效果一樣。 */ canvas.drawPath(path1, paint); ///////////////////////////////////////第二列 paint.setColor(Color.BLUE); paint.setStyle(Paint.Style.FILL);//設(shè)置實(shí)心 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); * 參數(shù)一為漸變起初點(diǎn)坐標(biāo)x位置,參數(shù)二為y軸位置,參數(shù)三和四分辨對(duì)應(yīng)漸變終點(diǎn) * 其中參數(shù)new int[]{startColor, midleColor,endColor}是參與漸變效果的顏色集合, * 其中參數(shù)new float[]{0 , 0.5f, 1.0f}是定義每個(gè)顏色處于的漸變相對(duì)位置, 這個(gè)參數(shù)可以為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:沿著漸變方向循環(huán)重復(fù) // CLAMP:如果在預(yù)先定義的范圍外畫的話,就重復(fù)邊界的顏色 // MIRROR:與REPEAT一樣都是循環(huán)重復(fù),但這個(gè)會(huì)對(duì)稱重復(fù) paint.setShader(mShader);// 用Shader中定義定義的顏色來(lái)話 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("長(zhǎng)方形", 240, 190, paint); canvas.drawText("橢圓形", 240, 250, paint); canvas.drawText("三角形", 240, 320, paint); canvas.drawText("梯形", 240, 390, paint); } }
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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