Android繪圖之Shader
Shader是繪圖過程中的著色器,它有五個子類:
BitmapShader
ComposeShader
LinearGradient
RadialGradient
SweepGradient
它一般用在paint.setShader(shader)
中实束,paint
是一個Paint
對象暑竟,shader
是一個Shader對象揍魂。
1. BitmapShader
BitmapShader是用來做位圖繪制時紋理的著色器宽闲,位圖可以通過指定的平鋪模式進行重復或者鏡像肃廓。
BitmapShader的構造方法:
-
BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
-
bitmap
是我們要進行著色的位圖 -
tileX
是我們在X軸的平鋪模式 -
tileY
是我們在Y軸的平鋪模式
-
平鋪模式有三種:
-
Shader.TileMode.CLAMP
:如果著色器超出原始邊界范圍挎峦,會復制邊緣顏色缀程。 -
Shader.TileMode.MIRROR
:橫向和縱向的重復著色器的圖像拦焚,交替鏡像圖像是相鄰的圖像總是接合。這個官方的說明可能不太好理解杠输,說白了赎败,就是圖像不停翻轉來平鋪,直到平鋪完畢蠢甲。 -
Shader.TileMode.REPEAT
: 橫向和縱向的重復著色器的圖像僵刮。
一般來說,當Canvas的寬度(高度)小于等于BitmapShader中Bitmap的寬度(高度)鹦牛,我們會使用Shader.TileMode.CLAMP
模式搞糕,否則我們會使用Shader.TileMode.MIRROR
或者Shader.TileMode.REPEAT
模式。
- X軸和Y軸平鋪模式分別設置為
BitmapShader.TileMode.REPEAT
,BitmapShader.TileMode.MIRROR
:
- X軸和Y軸平鋪模式分別設置為
BitmapShader.TileMode.MIRROR
,BitmapShader.TileMode.REPEAT
:
- X軸和Y軸平鋪模式都設置為
BitmapShader.TileMode.MIRROR
:
- X軸和Y軸平鋪模式都設置為
BitmapShader.TileMode.REPEAT
:
- X軸和Y軸平鋪模式都設置為
BitmapShader.TileMode.CLAMP
:
可以很明顯的看到當X軸和Y軸平鋪模式都設置為BitmapShader.TileMode.CLAMP
曼追,Canvas的寬度(高度)大于BitmapShader中Bitmap的寬度(高度)時窍仰,繪制出來的圖像比較丑,我們來看看Canvas的寬度(高度)小于等于BitmapShader中Bitmap的寬度(高度)時的繪圖情況礼殊,這種情況下面我們一般可以將我們的圖像剪切成各種形狀驹吮,最常見的是將圖像剪切成圖像。
2. ComposeShader
ComposeShader是一個組合著色器晶伦,它通過Xfermode
將兩個著色器組合起來碟狞。
ComposeShader有兩個構造方法:
-
ComposeShader(Shader shaderA, Shader shaderB, Xfermode mode)
-
shaderA
:這個著色器中的顏色被視為Xfermode
模式中的“dst” -
shaderB
:這個著色器中的顏色被視為Xfermode
模式中的“src” -
mode
:Xfermode
的模式
-
-
ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)
-
mode
:也可以看成是Xfermode
的模式,更具體地說它是PorterDuffXfermode
的模式
-
3. LinearGradient
LinearGradient是線性漸變的著色器。
LinearGradient有兩個構造方法:
-
LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
-
x0
表示漸變的起始點x坐標 -
y0
表示漸變的起始點y坐標 -
x1
表示漸變的終點x坐標 -
y1
表示漸變的終點y坐標 -
colors
表示漸變的顏色數(shù)組 -
positions
用來指定顏色數(shù)組的相對位置,可以為null婚陪,為null是表示顏色均勻分布 -
tile
表示平鋪模式
-
-
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)
-
color0
表示漸變開始顏色 -
color1
表示漸變結束顏色
-
利用LinearGradient實現(xiàn)一個從藍色線性漸變到紅色的圓形圖:
4. RadialGradient
RadialGradient是徑向漸變著色器族沃。
RadialGradient有兩個構造方法:
-
RadialGradient(float centerX, float centerY, float radius, int[] colors, float[] stops, Shader.TileMode tileMode)
-
centerX
:漸變中心x坐標 -
centerY
:漸變中心y坐標 -
radius
:漸變圓的半徑 -
colors
:分布在漸變圓中心到邊緣的顏色 -
stops
:取值0-1之間,用來指定顏色數(shù)組的相對位置,可以為null,為null是表示顏色均勻分布 -
tile
表示平鋪模式
-
-
RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, Shader.TileMode tileMode)
-
centerColor
表示漸變中心的顏色 -
edgeColor
:表示漸變邊緣的顏色
-
利用RadialGradient實現(xiàn)一個從藍色徑向漸變到紅色的圓形圖:
5. SweepGradient
SweepGradient是繞著一個中心點進行掃描的漸變著色器脆淹。
SweepGradient有兩個構造方法:
-
SweepGradient(float cx, float cy, int[] colors, float[] positions)
-
cx
:中心點的x坐標 -
cy
:中心點的y坐標 -
colors
:在中心點周圍分配的顏色數(shù)組常空,最少包含兩種顏色 -
positions
:取值0-1之間,用來指定顏色數(shù)組的相對位置,可以為null盖溺,為null是表示顏色均勻分布
-
-
SweepGradient(float cx, float cy, int color0, int color1)
-
color0
:開始掃描的顏色 -
color1
:結束掃描的顏色
-
利用SweepGradient實現(xiàn)一個從藍色掃描漸變到紅色的圓形圖: