Android繪圖之Shader

Android繪圖之Shader


Shader是繪圖過程中的著色器,它有五個(gè)子類:

  • BitmapShader
  • ComposeShader
  • LinearGradient
  • RadialGradient
  • SweepGradient

它一般用在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)色掃描漸變到紅色的圓形圖:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容