Android繪圖之Shader
Shader是繪圖過程中的著色器,它有五個(gè)子類:
BitmapShaderComposeShaderLinearGradientRadialGradientSweepGradient
它一般用在paint.setShader(shader)中,paint是一個(gè)Paint對(duì)象,shader是一個(gè)Shader對(duì)象。
1. BitmapShader
BitmapShader是用來做位圖繪制時(shí)紋理的著色器,位圖可以通過指定的平鋪模式進(jìn)行重復(fù)或者鏡像。
BitmapShader的構(gòu)造方法:
-
BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)-
bitmap是我們要進(jìn)行著色的位圖 -
tileX是我們?cè)赬軸的平鋪模式 -
tileY是我們?cè)赮軸的平鋪模式
-
平鋪模式有三種:
-
Shader.TileMode.CLAMP:如果著色器超出原始邊界范圍,會(huì)復(fù)制邊緣顏色。 -
Shader.TileMode.MIRROR:橫向和縱向的重復(fù)著色器的圖像,交替鏡像圖像是相鄰的圖像總是接合。這個(gè)官方的說明可能不太好理解,說白了,就是圖像不停翻轉(zhuǎn)來平鋪,直到平鋪完畢。 -
Shader.TileMode.REPEAT: 橫向和縱向的重復(fù)著色器的圖像。
一般來說,當(dāng)Canvas的寬度(高度)小于等于BitmapShader中Bitmap的寬度(高度),我們會(huì)使用Shader.TileMode.CLAMP模式,否則我們會(huì)使用Shader.TileMode.MIRROR或者Shader.TileMode.REPEAT模式。
- X軸和Y軸平鋪模式分別設(shè)置為
BitmapShader.TileMode.REPEAT,BitmapShader.TileMode.MIRROR:
- X軸和Y軸平鋪模式分別設(shè)置為
BitmapShader.TileMode.MIRROR,BitmapShader.TileMode.REPEAT:
- X軸和Y軸平鋪模式都設(shè)置為
BitmapShader.TileMode.MIRROR:
- X軸和Y軸平鋪模式都設(shè)置為
BitmapShader.TileMode.REPEAT:
- X軸和Y軸平鋪模式都設(shè)置為
BitmapShader.TileMode.CLAMP:
可以很明顯的看到當(dāng)X軸和Y軸平鋪模式都設(shè)置為BitmapShader.TileMode.CLAMP,Canvas的寬度(高度)大于BitmapShader中Bitmap的寬度(高度)時(shí),繪制出來的圖像比較丑,我們來看看Canvas的寬度(高度)小于等于BitmapShader中Bitmap的寬度(高度)時(shí)的繪圖情況,這種情況下面我們一般可以將我們的圖像剪切成各種形狀,最常見的是將圖像剪切成圖像。

2. ComposeShader
ComposeShader是一個(gè)組合著色器,它通過Xfermode將兩個(gè)著色器組合起來。
ComposeShader有兩個(gè)構(gòu)造方法:
-
ComposeShader(Shader shaderA, Shader shaderB, Xfermode mode)-
shaderA:這個(gè)著色器中的顏色被視為Xfermode模式中的“dst” -
shaderB:這個(gè)著色器中的顏色被視為Xfermode模式中的“src” -
mode:Xfermode的模式
-
-
ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)-
mode:也可以看成是Xfermode的模式,更具體地說它是PorterDuffXfermode的模式
-
3. LinearGradient
LinearGradient是線性漸變的著色器。
LinearGradient有兩個(gè)構(gòu)造方法:
-
LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)-
x0表示漸變的起始點(diǎn)x坐標(biāo) -
y0表示漸變的起始點(diǎn)y坐標(biāo) -
x1表示漸變的終點(diǎn)x坐標(biāo) -
y1表示漸變的終點(diǎn)y坐標(biāo) -
colors表示漸變的顏色數(shù)組 -
positions用來指定顏色數(shù)組的相對(duì)位置,可以為null,為null是表示顏色均勻分布 -
tile表示平鋪模式
-
-
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)-
color0表示漸變開始顏色 -
color1表示漸變結(jié)束顏色
-
利用LinearGradient實(shí)現(xiàn)一個(gè)從藍(lán)色線性漸變到紅色的圓形圖:

4. RadialGradient
RadialGradient是徑向漸變著色器。
RadialGradient有兩個(gè)構(gòu)造方法:
-
RadialGradient(float centerX, float centerY, float radius, int[] colors, float[] stops, Shader.TileMode tileMode)-
centerX:漸變中心x坐標(biāo) -
centerY:漸變中心y坐標(biāo) -
radius:漸變圓的半徑 -
colors:分布在漸變圓中心到邊緣的顏色 -
stops:取值0-1之間,用來指定顏色數(shù)組的相對(duì)位置,可以為null,為null是表示顏色均勻分布 -
tile表示平鋪模式
-
-
RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, Shader.TileMode tileMode)-
centerColor表示漸變中心的顏色 -
edgeColor:表示漸變邊緣的顏色
-
利用RadialGradient實(shí)現(xiàn)一個(gè)從藍(lán)色徑向漸變到紅色的圓形圖:

5. SweepGradient
SweepGradient是繞著一個(gè)中心點(diǎn)進(jìn)行掃描的漸變著色器。
SweepGradient有兩個(gè)構(gòu)造方法:
-
SweepGradient(float cx, float cy, int[] colors, float[] positions)-
cx:中心點(diǎn)的x坐標(biāo) -
cy:中心點(diǎn)的y坐標(biāo) -
colors:在中心點(diǎn)周圍分配的顏色數(shù)組,最少包含兩種顏色 -
positions:取值0-1之間,用來指定顏色數(shù)組的相對(duì)位置,可以為null,為null是表示顏色均勻分布
-
-
SweepGradient(float cx, float cy, int color0, int color1)-
color0:開始掃描的顏色 -
color1:結(jié)束掃描的顏色
-
利用SweepGradient實(shí)現(xiàn)一個(gè)從藍(lán)色掃描漸變到紅色的圓形圖:





