11.4.3 高級畫布繪圖(2)
提示:
圖11-1中沒有包含的是ComposerShader,它可以創(chuàng)建多個Shader和BitmapShader的組合,從而可以在一個位圖圖像的基礎上創(chuàng)建一個繪圖刷。
要在繪圖的時候使用一個Shader,可以使用setShader方法將其應用到一個Paint中,如下面的代碼所示:
- Paint shaderPaint = new Paint();
- shaderPaint.setShader(myLinearGradient);
你使用這個Paint所繪制的任何東西都將使用你指定的Shader進行填充,而不是使用Paint本身的顏色進行填充。
定義漸變Shader
如上所示,使用漸變Shader可以讓你使用交替改變的顏色來填充圖片;你可以將顏色漸變定義為兩種顏色的簡單交替,如下所示:
- int colorFrom = Color.BLACK;
- int colorTo = Color.WHITE;
- LinearGradient linearGradientShader = new LinearGradient(x1, y1, x2, y2,
- colorFrom,
- colorTo,
- TileMode.CLAMP);
或者,你還可以定義更復雜的按照設定比例進行分布的顏色序列,如下面的RadialGradientShader例子所示:
- int[] gradientColors = new int[3];
- gradientColors[0] = Color.GREEN;
- gradientColors[1] = Color.YELLOW;
- gradientColors[2] = Color.RED;
- float[] gradientPositions = new float[3];
- gradientPositions[0] = 0.0f;
- gradientPositions[1] = 0.5f;
- gradientPositions[2] = 1.0f;
- RadialGradient radialGradientShader=new RadialGradient(centerX,centerY, radius,
- gradientColors,
- gradientPositions,
- TileMode.CLAMP);
每一種漸變Shader(線性的、輻射形的和掃描狀的)都可以使用以上這兩種技術來定義漸變填充。
使用Shader TileModes
漸變Shader的畫刷大小既可以顯式地使用有邊界的矩形來定義,也可以使用中心點和半徑長度來定義。Bitmap Shader可以通過它的位圖大小來決定它的畫刷大小。
如果Shader畫刷所定義的區(qū)域比要填充的區(qū)域小,那么TileMode將會決定如何處理剩余的區(qū)域:
CLAMP 使用Shader的邊界顏色來填充剩余的空間。
MIRROR 在水平和垂直方向上拉伸Shader圖像,這樣每一個圖像就都能與上一個縫合了。
REPEAT 在水平和垂直方向上重復Shader圖像,但不拉伸它。
使用MaskFilter
MaskFilter類可以為Paint分配邊緣效果。
對MaskFilter的擴展可以對一個Paint邊緣的alpha通道應用轉(zhuǎn)換。Android包含了下面幾種MaskFilter:
BlurMaskFilter 指定了一個模糊的樣式和半徑來處理Paint的邊緣。
EmbossMaskFilter 指定了光源的方向和環(huán)境光強度來添加浮雕效果。
要應用一個MaskFilter,可以使用setMaskFilter方法,并傳遞給它一個MaskFilter對象。下面的例子是對一個已經(jīng)存在的Paint應用一個EmbossMaskFilter:
- // 設置光源的方向
- float[] direction = new float[]{ 1, 1, 1 };
- //設置環(huán)境光亮度
- float light = 0.4f;
- // 選擇要應用的反射等級
- float specular = 6;
- // 向mask應用一定級別的模糊
- float blur = 3.5f;
- EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);
- // 應用mask
- myPaint.setMaskFilter(emboss);
SDK中包含的FingerPaint API demo是說明如何使用MaskFilter的一個非常好的例子。它展示了這兩種filter的效果。
使用ColorFilter
MaskFilter是對一個Paint的alpha通道的轉(zhuǎn)換,而ColorFilter則是對每一個RGB通道應用轉(zhuǎn)換。所有由ColorFilter所派生的類在執(zhí)行它們的轉(zhuǎn)換時,都會忽略alpha通道。
Android包含三個ColorFilter:
ColorMatrixColorFilter 可以指定一個4×5的ColorMatrix并將其應用到一個Paint中。ColorMatrixes通常在程序中用于對圖像進行處理,而且由于它們支持使用矩陣相乘的方法來執(zhí)行鏈接轉(zhuǎn)換,所以它們很有用。
LightingColorFilter 乘以第一個顏色的RGB通道,然后加上第二個顏色。每一次轉(zhuǎn)換的結果都限制在0到255之間。
PorterDuffColorFilter 可以使用數(shù)字圖像合成的16條Porter-Duff 規(guī)則中的任意一條來向Paint應用一個指定的顏色。
使用setColorFilter方法應用ColorFilter,如下所示:
myPaint.setColorFilter(new LightingColorFilter(Color.BLUE, Color.RED));
API中的ColorMatrixSample是說明如何使用ColorFilter和Color Matrix的非常好的例子。
使用PathEffect
到目前為止,所有的效應都會影響到Paint填充圖像的方式;PathEffect是用來控制繪制輪廓(線條)的方式。
PathEffect對于繪制Path基本圖形特別有用,但是它們也可以應用到任何Paint中從而影響線條繪制的方式。
使用PathEffect,可以改變一個形狀的邊角的外觀并且控制輪廓的外表。Android包含了多個PathEffect,包括:
CornerPathEffect 可以使用圓角來代替尖銳的角從而對基本圖形的形狀尖銳的邊角進行平滑。