在Paint中有很多的屬性可以設(shè)置挽唉,比如可以設(shè)置陰影称勋,顏色過濾等等,這些會產(chǎn)生不同的奇妙效果顷扩,今天就對各種屬性探索一下啸澡。
方法一:
1 //設(shè)置繪制的顏色袖订,a代表透明度,r嗅虏,g洛姑,b代表顏色值。 2 setARGB(int a,int r,int g,int b);
這個(gè)不多說了皮服,還有兩個(gè)類似的方法楞艾,將設(shè)置alpha和rgb分割開來了。注意的是這里的a值是0~255的范圍龄广,不是小數(shù)硫眯。
方法二:
//設(shè)置是否使用抗鋸齒功能,會消耗較大資源择同,繪制圖形速度會變慢两入。setAntiAlias(boolean aa);
也不多說,你可以試驗(yàn)一下效果敲才,設(shè)置后會平滑一些裹纳;
方法三:
1 //設(shè)定是否使用圖像抖動(dòng)處理,會使繪制出來的圖片顏色更加平滑和飽滿紧武,圖像更加清晰 2 setDither(boolean dither);
方法四:
1 //設(shè)置MaskFilter剃氧,可以用不同的MaskFilter實(shí)現(xiàn)濾鏡的效果,如濾化阻星,立體等 2 setMaskFilter(MaskFilter maskfilter);
MaskFilter類可以為Paint分配邊緣效果朋鞍。對MaskFilter的擴(kuò)展可以對一個(gè)Paint邊緣的alpha通道應(yīng)用轉(zhuǎn)換。Android包含了下面幾種MaskFilter:BlurMaskFilter 指定了一個(gè)模糊的樣式和半徑來處理Paint的邊緣。EmbossMaskFilter 指定了光源的方向和環(huán)境光強(qiáng)度來添加浮雕效果番舆。要應(yīng)用一個(gè)MaskFilter酝碳,可以使用setMaskFilter方法,并傳遞給它一個(gè)MaskFilter對象恨狈。下面的例子是對一個(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)用的反射等級 8 float specular = 6; 9 10 // 向mask應(yīng)用一定級別的模糊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è)置顏色過濾器芽偏,可以在繪制顏色時(shí)實(shí)現(xiàn)不用顏色的變換效果2 setColorFilter(ColorFilter colorfilter);
這個(gè)方法也值得試驗(yàn)一下:
MaskFilter是對一個(gè)Paint的alpha通道的轉(zhuǎn)換,而ColorFilter則是對每一個(gè)RGB通道應(yīng)用轉(zhuǎn)換弦讽。所有由ColorFilter所派生的類在執(zhí)行它們的轉(zhuǎn)換時(shí)污尉,都會忽略alpha通道。
這個(gè)貌似比較麻煩往产,改天再說被碗。
方法六:
1 //設(shè)置繪制路徑的效果,如點(diǎn)畫線等2 setPathEffect(PathEffect effect);
又是一個(gè)很好玩的方法:
到目前為止仿村,所有的效應(yīng)都會影響到Paint填充圖像的方式锐朴;PathEffect是用來控制繪制輪廓(線條)的方式。PathEffect對于繪制Path基本圖形特別有用蔼囊,但是它們也可以應(yīng)用到任何Paint中從而影響線條繪制的方式焚志。使用PathEffect,可以改變一個(gè)形狀的邊角的外觀并且控制輪廓的外表畏鼓。Android包含了多個(gè)PathEffect酱酬,包括:1)CornerPathEffect 可以使用圓角來代替尖銳的角從而對基本圖形的形狀尖銳的邊角進(jìn)行平滑。
2)DashPathEffect 可以使用DashPathEffect來創(chuàng)建一個(gè)虛線的輪廓(短橫線/小圓點(diǎn))滴肿,而不是使用實(shí)線岳悟。你還可以指定任意的虛/實(shí)線段的重復(fù)模式。
3) DiscretePathEffect 與DashPathEffect相似泼差,但是添加了隨機(jī)性贵少。當(dāng)繪制它的時(shí)候,需要指定每一段的長度和與原始路徑的偏離度堆缘。
4)PathDashPathEffect 這種效果可以定義一個(gè)新的形狀(路徑)并將其用作原始路徑的輪廓標(biāo)記滔灶。下面的效果可以在一個(gè)Paint中組合使用多個(gè)Path Effect。1)SumPathEffect 順序地在一條路徑中添加兩種效果吼肥,這樣每一種效果都可以應(yīng)用到原始路徑中录平,而且兩種結(jié)果可以結(jié)合起來麻车。2)ComposePathEffect 將兩種效果組合起來應(yīng)用,先使用第一種效果斗这,然后在這種效果的基礎(chǔ)上應(yīng)用第二種效果动猬。對象形狀的PathEffect的改變會影響到形狀的區(qū)域。這就能夠保證應(yīng)用到相同形狀的填充效果將會繪制到新的邊界中表箭。使用setPathEffect方法可以把PathEffect應(yīng)用到Paint對象中赁咙,如下所示:
1 paint.setPathEffect(new CornerPathEffect(10));
其他效果懶得測試了,這個(gè)在模擬器上跑的時(shí)候效果也不明顯免钻,但是真機(jī)上跑的時(shí)候的確圓滑了許多彼水,看上去很舒服
方法七:
1 //設(shè)置圖形重疊時(shí)的處理方式,如合并极舔,取交集或并集凤覆,經(jīng)常用來制作橡皮的擦除效果2 setXfermode(Xfermode xfermode);
橡皮擦,這是個(gè)好方法啊拆魏,看看盯桦。
可以通過修改Paint的Xfermode來影響在Canvas已有的圖像上面繪制新的顏色的方式。在正常的情況下稽揭,在已有的圖像上繪圖將會在其上面添加一層新的形狀俺附。如果新的Paint是完全不透明的,那么它將完全遮擋住下面的Paint溪掀;如果它是部分透明的,那么它將會被染上下面的顏色步鉴。下面的Xfermode子類可以改變這種行為:1)AvoidXfermode 指定了一個(gè)顏色和容差揪胃,強(qiáng)制Paint避免在它上面繪圖(或者只在它上面繪圖)。2)PixelXorXfermode 當(dāng)覆蓋已有的顏色時(shí)氛琢,應(yīng)用一個(gè)簡單的像素XOR操作喊递。3)PorterDuffXfermode 這是一個(gè)非常強(qiáng)大的轉(zhuǎn)換模式,使用它阳似,可以使用圖像合成的16條Porter-Duff規(guī)則的任意一條來控制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)完美的橡皮擦功能俏讹!代碼異常簡單:
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即畫筆玲献,在繪圖過程中起到了極其重要的作用殉疼,畫筆主要保存了顏色梯浪,
* 樣式等繪制信息,指定了如何繪制文本和圖形瓢娜,畫筆對象有很多設(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è)置繪制的顏色,使用顏色值來表示淤井,該顏色值包括透明度和RGB顏色布疼。
*
* setAntiAlias(boolean aa);
* 設(shè)置是否使用抗鋸齒功能,會消耗較大資源币狠,繪制圖形速度會變慢游两。
*
* setDither(boolean dither);
* 設(shè)定是否使用圖像抖動(dòng)處理,會使繪制出來的圖片顏色更加平滑和飽滿漩绵,圖像更加清晰
*
* setFilterBitmap(boolean filter);
* 如果該項(xiàng)設(shè)置為true贱案,則圖像在動(dòng)畫進(jìn)行中會濾掉對Bitmap圖像的優(yōu)化操作,加快顯示
* 速度止吐,本設(shè)置項(xiàng)依賴于dither和xfermode的設(shè)置
*
* setMaskFilter(MaskFilter maskfilter);
* 設(shè)置MaskFilter宝踪,可以用不同的MaskFilter實(shí)現(xiàn)濾鏡的效果,如濾化碍扔,立體等 *
* setColorFilter(ColorFilter colorfilter);
* 設(shè)置顏色過濾器瘩燥,可以在繪制顏色時(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)常用來制作橡皮的擦除效果
*
* 2.文本繪制
* setFakeBoldText(boolean fakeBoldText);
* 模擬實(shí)現(xiàn)粗體文字,設(shè)置在小字體上效果會非常差
*
* setSubpixelText(boolean subpixelText);
* 設(shè)置該項(xiàng)為true桩卵,將有助于文本在LCD屏幕上的顯示效果
*
* setTextAlign(Paint.Align align);
* 設(shè)置繪制文字的對齊方向
*
- setTextScaleX(float scaleX);
- 設(shè)置繪制文字x軸的縮放比例验靡,可以實(shí)現(xiàn)文字的拉伸的效果
- setTextSize(float textSize);
- 設(shè)置繪制文字的字號大小
- setTextSkewX(float skewX);
- 設(shè)置斜體文字,skewX為傾斜弧度
- setTypeface(Typeface typeface);
- 設(shè)置Typeface對象雏节,即字體風(fēng)格胜嗓,包括粗體,斜體以及襯線體钩乍,非襯線體等
- setUnderlineText(boolean underlineText);
- 設(shè)置帶有下劃線的文字效果
- setStrikeThruText(boolean strikeThruText);
- 設(shè)置帶有刪除線的效果
*/
Java代碼 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();//把開始的點(diǎn)和最后的點(diǎn)連接在一起辞州,構(gòu)成一個(gè)封閉圖形
/*
* 最重要的就是movtTo和close,如果是Style.FILL的話,不設(shè)置close,也沒有區(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ù)三和四分辨對應(yīng)漸變終點(diǎn)
* 其中參數(shù)new int[]{startColor, midleColor,endColor}是參與漸變效果的顏色集合衫生,
* 其中參數(shù)new float[]{0 , 0.5f, 1.0f}是定義每個(gè)顏色處于的漸變相對位置裳瘪, 這個(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è)會對稱重復(fù)
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);
}
}