shader中文翻譯著色器,主要實(shí)現(xiàn)顏色漸變付翁。
谷歌的注釋:shader是在繪制期間返回水平顏色跨度的對(duì)象的基礎(chǔ)類晃听。著色的子類安裝在調(diào)用paint.setshader(shader)的繪制中。之后佣渴,用該繪制的任何對(duì)象(位圖除外)都將從材質(zhì)球獲取其顏色初斑。
線性渲染
/**
* 1.線性渲染,LinearGradient(float x0, float y0, float x1, float y1, @NonNull @ColorInt int colors[], @Nullable float positions[], @NonNull TileMode tile)
* (x0,y0):漸變起始點(diǎn)坐標(biāo)
* (x1,y1):漸變結(jié)束點(diǎn)坐標(biāo)
* color0:漸變開(kāi)始點(diǎn)顏色,16進(jìn)制的顏色表示见秤,必須要帶有透明度
* color1:漸變結(jié)束顏色
* colors:漸變數(shù)組
* positions:位置數(shù)組,position的取值范圍[0,1],作用是指定某個(gè)位置的顏色值乎澄,如果傳null测摔,漸變就線性變化。
* tile:用于指定控件區(qū)域大于指定的漸變區(qū)域時(shí)锋八,空白區(qū)域的顏色填充方法
*/
mShader = new LinearGradient(0, 0, 500, 500, new int[]{Color.RED, Color.BLUE, Color.GREEN}, new float[]{0.f,0.7f,1}, Shader.TileMode.REPEAT);
mPaint.setShader(mShader);
canvas.drawRect(0,0,1000,1000, mPaint);
環(huán)形渲染
/**
* 環(huán)形渲染挟纱,RadialGradient(float centerX, float centerY, float radius, @ColorInt int colors[], @Nullable float stops[], TileMode tileMode)
* centerX ,centerY:shader的中心坐標(biāo),開(kāi)始漸變的坐標(biāo)
* radius:漸變的半徑
* centerColor,edgeColor:中心點(diǎn)漸變顏色檀轨,邊界的漸變顏色
* colors:漸變顏色數(shù)組
* stoops:漸變位置數(shù)組围苫,類似掃描漸變的positions數(shù)組撤师,取值[0,1],中心點(diǎn)為0,半徑到達(dá)位置為1.0f
* tileMode:shader未覆蓋以外的填充模式腺占。
*/
mShader = new RadialGradient(250, 250, 250, new int[]{Color.GREEN, Color.YELLOW, Color.RED}, null, Shader.TileMode.CLAMP);
mPaint.setShader(mShader);
canvas.drawCircle(250, 250, 250, mPaint);
掃描渲染
/**
* 掃描渲染,SweepGradient(float cx, float cy, @ColorInt int color0,int color1)
* cx,cy 漸變中心坐標(biāo)
* color0,color1:漸變開(kāi)始結(jié)束顏色
* colors铡羡,positions:類似LinearGradient,用于多顏色漸變,positions為null時(shí)意鲸,根據(jù)顏色線性漸變
*/
mShader = new SweepGradient(250, 250, Color.RED, Color.GREEN);
mPaint.setShader(mShader);
canvas.drawCircle(250, 250, 250, mPaint);
位圖渲染
/**
* 位圖渲染,BitmapShader(@NonNull Bitmap bitmap, @NonNull TileMode tileX, @NonNull TileMode tileY)
* Bitmap:構(gòu)造shader使用的bitmap
* tileX:X軸方向的TileMode
* tileY:Y軸方向的TileMode
// REPEAT, 繪制區(qū)域超過(guò)渲染區(qū)域的部分读慎,重復(fù)排版
// CLAMP槐雾, 繪制區(qū)域超過(guò)渲染區(qū)域的部分,會(huì)以最后一個(gè)像素拉伸排版
// MIRROR, 繪制區(qū)域超過(guò)渲染區(qū)域的部分株灸,鏡像翻轉(zhuǎn)排版
// */
mShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.MIRROR);
mPaint.setShader(mShader);
canvas.drawRect(0, 0, 500, 500, mPaint);
組合渲染
/**
* 組合渲染擎值,
* ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB, Xfermode mode)
* ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB, PorterDuff.Mode mode)
* shaderA,shaderB:要混合的兩種shader
* Xfermode mode: 組合兩種shader顏色的模式
* PorterDuff.Mode mode: 組合兩種shader顏色的模式
*/
BitmapShader bitmapShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
LinearGradient linearGradient = new LinearGradient(0, 0, 1000, 1600, new int[]{Color.RED, Color.GREEN, Color.BLUE}, null, Shader.TileMode.CLAMP);
mShader = new ComposeShader(bitmapShader, linearGradient, PorterDuff.Mode.MULTIPLY);
mPaint.setShader(mShader);
canvas.drawCircle(250, 250, 250, mPaint);