日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android Shader著色器/渲染器的用法解析

瀏覽:26日期:2022-09-24 14:33:39

一、介紹

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

BitmapShader: 位圖渲染

LinearGradient: 線性渲染

SweepGradient: 梯度渲染

RadialGradient: 光束渲染

ComposeShader: 組合渲染

渲染模式:Shader.TileMode

Shader.TileMode.CLAMP: 邊緣拉伸模式,它會(huì)拉伸邊緣的一個(gè)像素來(lái)填充其他區(qū)域。

Shader.TileMode.MIRROR: 鏡像模式,通過(guò)鏡像變化來(lái)填充其他區(qū)域。需要注意的是,鏡像模式先進(jìn)行y軸方向的鏡像操作,然后在進(jìn)行x軸方向上的鏡像操作。

Shader.TileMode.REPEAT:重復(fù)模式,通過(guò)復(fù)制來(lái)填充其他區(qū)域

下面的圖:X軸是邊緣拉伸模式,Y重復(fù)模式

Android Shader著色器/渲染器的用法解析

鏡像模式:xy軸均是鏡像模式

Android Shader著色器/渲染器的用法解析

二、效果介紹:

1.BitmapShader: 位圖渲染

構(gòu)造方法:BitmapShader (Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)

參數(shù):

bitmap:要處理的bitmap對(duì)象

tileX:在X軸處理的效果,Shader.TileMode里有三種模式:CLAMP、MIRROR和REPETA

tileY:在Y軸處理的效果,Shader.TileMode里有三種模式:CLAMP、MIRROR和REPETA

我們給畫(huà)筆填充一個(gè)五角星,然后繪制一條直線

Shader shader[] = new Shader[8];bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.star);shader[0] = new BitmapShader(bitmap,Shader.TileMode.REPEAT,Shader.TileMode.REPEAT);Paint paint = new Paint();paint.setStyle(Paint.Style.FILL);paint.setStrokeWidth(32);paint.setShader(shader[0]);int lineHeight = 100,lineOffset = 50;canvas.drawLine(0,lineHeight,parentWidth,100,paint);

Android Shader著色器/渲染器的用法解析

2.LinearGradient: 線性渲染

LinearGradient是顏色線性漸變的著色器。

構(gòu)造函數(shù):

LinearGradient (float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)

LinearGradient (float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)

參數(shù):

(x0,y0)表示漸變的起點(diǎn),(x1,y1)表示漸變的終點(diǎn)坐標(biāo),這兩點(diǎn)都是相對(duì)于屏幕坐標(biāo)系。

color0,color1分別表示起點(diǎn)的顏色和終點(diǎn)的顏色。

也傳入多個(gè)顏色,和每個(gè)顏色的起始位置。

colors[]傳入多個(gè)顏色值進(jìn)去

positions[] 位置數(shù)組

而且當(dāng)positions參數(shù)傳入null時(shí),代表顏色是均勻的填充整個(gè)漸變區(qū)域的,顯得比較柔和。

通過(guò)兩個(gè)構(gòu)造函數(shù)分別畫(huà)兩條線:

lineHeight += lineOffset;shader[1] = new LinearGradient(0,lineHeight,parentWidth,lineHeight,Color.RED,Color.GREEN,Shader.TileMode.REPEAT);paint.setShader(shader[1]);canvas.drawLine(0,lineHeight,parentWidth,lineHeight,paint);lineHeight += lineOffset;shader[2] = new LinearGradient(0,lineHeight,parentWidth,lineHeight,GRADIENT_COLORS,null,Shader.TileMode.REPEAT);paint.setShader(shader[2]);canvas.drawLine(0,lineHeight,parentWidth,lineHeight,paint);

Android Shader著色器/渲染器的用法解析

3.SweepGradient: 梯度渲染

SweepGradient是梯度漸變,也稱(chēng)為掃描式漸變,可以實(shí)現(xiàn)雷達(dá)掃描效果。

構(gòu)造函數(shù):

SweepGradient(float cx, float cy, int color0, int color1)

參數(shù):

(cx,cy)表示漸變效果的中心點(diǎn),也就是雷達(dá)掃描的圓點(diǎn)。color0和color1表示漸變的起點(diǎn)色和終點(diǎn)色。

顏色漸變是順時(shí)針的,從中心點(diǎn)的x軸正方形開(kāi)始。

注意:這里構(gòu)造函數(shù)并不需要TileMode,因?yàn)樘荻葷u變的邊界相當(dāng)于無(wú)限大的。

構(gòu)造函數(shù):

SweepGradient(float cx, float cy,int colors[], float positions[])

參數(shù):

colors[]顏色數(shù)組

positions數(shù)組,該數(shù)組中每一個(gè)position對(duì)應(yīng)colors數(shù)組中每個(gè)顏色在360度中的相對(duì)位置,

position取值范圍為[0,1],0和1都表示3點(diǎn)鐘位置,0.25表示6點(diǎn)鐘位置,0.5表示9點(diǎn)鐘位置,0.75表示12點(diǎn)鐘位置,

通過(guò)要個(gè)構(gòu)造函數(shù)繪制兩個(gè)實(shí)心圓,其中第二個(gè)圓指定positions

public static final int[] GRADIENT_COLORS = new int[]{ Color.RED,Color.YELLOW,Color.BLUE, Color.GREEN, Color.WHITE, Color.RED };public static final float[] GRADIENT_POSITONS = new float[]{ 0.0f,0.5f,0.55f,0.6f,0.65f,1.0f};

lineHeight += lineOffset +32;shader[3] = new SweepGradient(150,lineHeight,GRADIENT_COLORS,null);paint.setShader(shader[3]);canvas.drawCircle(150,lineHeight,50,paint);shader[4] = new SweepGradient(450,lineHeight,GRADIENT_COLORS,GRADIENT_POSITONS);paint.setShader(shader[4]);canvas.drawCircle(450,lineHeight,50,paint);

Android Shader著色器/渲染器的用法解析

4.RadialGradient: 光束渲染

RadialGradient:創(chuàng)建從中心向四周發(fā)散的輻射漸變效果,

構(gòu)造函數(shù):

RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, Shader.TileMode tileMode)

參數(shù):

centerX 圓心的X坐標(biāo)

centerY 圓心的Y坐標(biāo)

radius 圓的半徑

centerColor 中心顏色

edgeColor 邊緣顏色

構(gòu)造函數(shù):

RadialGradient(float centerX, float centerY, float radius, int[] colors, float[] stops, Shader.TileMode tileMode)

參數(shù):

colors[]傳入多個(gè)顏色值進(jìn)去,這樣就會(huì)用colors數(shù)組中指定的顏色值一起進(jìn)行顏色線性插值。

stops數(shù)組,該數(shù)組中每一個(gè)stop對(duì)應(yīng)colors數(shù)組中每個(gè)顏色在半徑中的相對(duì)位置,

stop[]取值范圍為[0,1],0表示圓心位置,1表示圓周位置。如果stops數(shù)組為null,那么Android會(huì)自動(dòng)為colors設(shè)置等間距的位置。

private float period = 0; //偏移量變化周期值

lineHeight += lineOffset + 150;shader[5] = new RadialGradient(150,lineHeight,10,Color.GREEN,Color.RED,Shader.TileMode.MIRROR);paint.setShader(shader[5]);canvas.drawCircle(150,lineHeight,100,paint);if ( period < 250 || period >= 650){ period = 250;}else { period += 5F;}shader[6] = new RadialGradient(period,lineHeight,30,GRADIENT_COLORS,null,Shader.TileMode.MIRROR);paint.setShader(shader[6]);canvas.drawCircle(450,lineHeight,100,paint);

這里多指定了一個(gè)period,設(shè)置為漸變的圓心x軸坐標(biāo),這樣就可以實(shí)現(xiàn)滾動(dòng)的小球

Android Shader著色器/渲染器的用法解析

同樣也可以設(shè)置繪制的圓心跟隨滾動(dòng):將圓心Y軸坐標(biāo)設(shè)置為period,實(shí)現(xiàn)小球從上往下掉的效果

canvas.drawCircle(450,period,100,paint);

Android Shader著色器/渲染器的用法解析

5.ComposeShader: 組合渲染

ComposeShader用來(lái)組合不同的Shader,可以將兩個(gè)不同的Shader組合在一起

構(gòu)造函數(shù):

ComposeShader (Shader shaderA, Shader shaderB, Xfermode mode)

ComposeShader (Shader shaderA, Shader shaderB, PorterDuff.Mode mode)

參數(shù):

shaderA shaderB 兩種渲染效果

mode 疊加效果:PorterDuff圖形混合模式介紹

將bitmapShader和RadialGradient模式復(fù)合

lineHeight += lineOffset + 350;bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.head);shader[0] = new BitmapShader(bitmap, Shader.TileMode.REPEAT,Shader.TileMode.REPEAT);shader[6] = new RadialGradient(150,lineHeight,550,Color.BLACK,Color.TRANSPARENT, Shader.TileMode.CLAMP);//混合產(chǎn)生新的Shader.shader[7] = new ComposeShader(shader[0],shader[6],PorterDuff.Mode.DST_IN);paint.setShader(shader[7]);//以新的Shader繪制一個(gè)圓。canvas.drawCircle(150,lineHeight,550,paint);

左下角的漸漸模糊的圖片便是組合效果

Android Shader著色器/渲染器的用法解析

全部代碼:

//shader 畫(huà)筆填充private void my_shader(Canvas canvas){ //Shader.TileMode是指平鋪模式 //Shader.TileMode.CLAMP是邊緣拉伸模式,它會(huì)拉伸邊緣的一個(gè)像素來(lái)填充其他區(qū)域。 //Shader.TileMode.MIRROR是鏡像模式,通過(guò)鏡像變化來(lái)填充其他區(qū)域。需要注意的是,鏡像模式先進(jìn)行y軸方向的鏡像操作,然后在進(jìn)行x軸方向上的鏡像操作。 //Shader.TileMode.REPEAT是重復(fù)模式,通過(guò)復(fù)制來(lái)填充其他區(qū)域 //bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.head); Shader shader[] = new Shader[8]; bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.star); shader[0] = new BitmapShader(bitmap,Shader.TileMode.REPEAT,Shader.TileMode.REPEAT); Paint paint = new Paint(); paint.setStyle(Paint.Style.FILL); paint.setStrokeWidth(32); paint.setShader(shader[0]); int lineHeight = 100,lineOffset = 50; canvas.drawLine(0,lineHeight,parentWidth,100,paint); //canvas.drawCircle(240,240,100,paint); //LinearGradient是顏色線性漸變的著色器。 //LinearGradient (float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile) //(x0,y0)表示漸變的起點(diǎn),(x1,y1)表示漸變的終點(diǎn)坐標(biāo),這兩點(diǎn)都是相對(duì)于屏幕坐標(biāo)系。color0,color1分別表示起點(diǎn)的顏色和終點(diǎn)的顏色。 //LinearGradient (float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile) //多色漸變的構(gòu)造函數(shù)中,我們可以傳入多個(gè)顏色,和每個(gè)顏色的占比。而且當(dāng)positions參數(shù)傳入null時(shí),代表顏色是均勻的填充整個(gè)漸變區(qū)域的,顯得比較柔和。 lineHeight += lineOffset; shader[1] = new LinearGradient(0,lineHeight,parentWidth,lineHeight,Color.RED,Color.GREEN,Shader.TileMode.REPEAT); paint.setShader(shader[1]); canvas.drawLine(0,lineHeight,parentWidth,lineHeight,paint); lineHeight += lineOffset; shader[2] = new LinearGradient(0,lineHeight,parentWidth,lineHeight,GRADIENT_COLORS,null,Shader.TileMode.REPEAT); paint.setShader(shader[2]); canvas.drawLine(0,lineHeight,parentWidth,lineHeight,paint); //SweepGradient是梯度漸變,也稱(chēng)為掃描式漸變,效果有點(diǎn)類(lèi)似與雷達(dá)掃描效果。 //SweepGradient(float cx, float cy, int color0, int color1) // (cx,cy)表示漸變效果的中心點(diǎn),也就是雷達(dá)掃描的圓點(diǎn)。color0和color1表示漸變的起點(diǎn)色和終點(diǎn)色。 // 顏色漸變是順時(shí)針的,從中心點(diǎn)的x軸正方形開(kāi)始。 // 注意:這里構(gòu)造函數(shù)并不需要TileMode,因?yàn)樘荻葷u變的邊界相當(dāng)于無(wú)限大的。 //SweepGradient(float cx, float cy,int colors[], float positions[]) //colors[]顏色數(shù)組 //positions數(shù)組,該數(shù)組中每一個(gè)position對(duì)應(yīng)colors數(shù)組中每個(gè)顏色在360度中的相對(duì)位置, // position取值范圍為[0,1],0和1都表示3點(diǎn)鐘位置,0.25表示6點(diǎn)鐘位置,0.5表示9點(diǎn)鐘位置,0.75表示12點(diǎn)鐘位置, lineHeight += lineOffset +32; shader[3] = new SweepGradient(150,lineHeight,GRADIENT_COLORS,null); paint.setShader(shader[3]); canvas.drawCircle(150,lineHeight,50,paint); shader[4] = new SweepGradient(450,lineHeight,GRADIENT_COLORS,GRADIENT_POSITONS); paint.setShader(shader[4]); canvas.drawCircle(450,lineHeight,50,paint); //RadialGradient:創(chuàng)建從中心向四周發(fā)散的輻射漸變效果,其有兩個(gè)構(gòu)造函數(shù): //RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, Shader.TileMode tileMode) //centerX 圓心的X坐標(biāo) //centerY 圓心的Y坐標(biāo) //radius 圓的半徑 //centerColor 中心顏色 //edgeColor 邊緣顏色 //RadialGradient(float centerX, float centerY, float radius, int[] colors, float[] stops, Shader.TileMode tileMode) //colors[]傳入多個(gè)顏色值進(jìn)去,這樣就會(huì)用colors數(shù)組中指定的顏色值一起進(jìn)行顏色線性插值。 // stops數(shù)組,該數(shù)組中每一個(gè)stop對(duì)應(yīng)colors數(shù)組中每個(gè)顏色在半徑中的相對(duì)位置, // stop[]取值范圍為[0,1],0表示圓心位置,1表示圓周位置。如果stops數(shù)組為null,那么Android會(huì)自動(dòng)為colors設(shè)置等間距的位置。 lineHeight += lineOffset + 150; shader[5] = new RadialGradient(150,lineHeight,10,Color.GREEN,Color.RED,Shader.TileMode.MIRROR); paint.setShader(shader[5]); canvas.drawCircle(150,lineHeight,100,paint); if ( period < 250 || period >= 650){ period = 250; }else { period += 5F; } shader[6] = new RadialGradient(period,lineHeight,30,GRADIENT_COLORS,null,Shader.TileMode.MIRROR); paint.setShader(shader[6]); canvas.drawCircle(450,period,100,paint); //ComposeShader用來(lái)組合不同的Shader,可以將兩個(gè)不同的Shader組合在一起,它有兩個(gè)構(gòu)造函數(shù): //ComposeShader (Shader shaderA, Shader shaderB, Xfermode mode) //ComposeShader (Shader shaderA, Shader shaderB, PorterDuff.Mode mode) lineHeight += lineOffset + 350; bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.head); shader[0] = new BitmapShader(bitmap, Shader.TileMode.REPEAT,Shader.TileMode.REPEAT); shader[6] = new RadialGradient(150,lineHeight,550,Color.BLACK,Color.TRANSPARENT, Shader.TileMode.CLAMP); //混合產(chǎn)生新的Shader. shader[7] = new ComposeShader(shader[0],shader[6],PorterDuff.Mode.DST_IN); paint.setShader(shader[7]); //以新的Shader繪制一個(gè)圓。 canvas.drawCircle(150,lineHeight,550,paint);}

以上這篇Android Shader著色器/渲染器的用法解析就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
香蕉成人av| 一区二区三区国产在线| 清纯唯美亚洲综合一区| 亚洲影视一区| 亚洲毛片在线免费| 蜜桃av一区二区在线观看| 午夜一区在线| 在线观看一区| 日本不卡一区二区| 久久国产日韩欧美精品| 国产精品99久久久久久董美香| 欧美影院精品| 久久香蕉网站| 久久精品系列| 日韩毛片视频| 亚洲午夜91| 亚洲自拍另类| 日韩精品视频中文字幕| 欧美午夜三级| 国产一区二区三区精品在线观看| 成人三级高清视频在线看| 亚洲精品永久免费视频| 激情综合激情| 亚洲欧美在线综合| 国产精品欧美一区二区三区不卡| 欧美日韩夜夜| 国产精品久久久久久久久久10秀| 久久国产日本精品| 亚洲色诱最新| 日韩精品免费视频人成| 久久久久观看| 欧美日韩一二| 在线日韩成人| 久久99国产精品视频| 精品国模一区二区三区| 亚洲欧美视频| 国产日产高清欧美一区二区三区| 国内不卡的一区二区三区中文字幕| 亚洲性色视频| 日本不卡在线视频| 色一区二区三区| 视频一区中文字幕国产| 国产精品一区二区美女视频免费看 | 国产专区一区| 中文在线日韩| 国产一区二区精品福利地址| 午夜日本精品| 欧美成人精品一级| 日本久久黄色| 亚洲免费网址| 精品99在线| 石原莉奈在线亚洲二区| 国产精品久久777777毛茸茸| 99精品视频精品精品视频| 99国产精品私拍| 国产精品久久久久久av公交车| 欧美日韩在线播放视频| 欧美在线日韩| 在线日韩中文| 久久一区国产| 亚洲综合日韩| 国产91欧美| 亚久久调教视频| 欧洲亚洲一区二区三区| 日韩av中文字幕一区| 久久黄色影院| 国产亚洲高清一区| 伊人成人在线视频| 国产成人在线中文字幕| 亚洲另类av| 中文字幕人成乱码在线观看| 日本不卡视频一二三区| 欧美日韩亚洲在线观看| 国产精品国码视频| 男人的天堂亚洲一区| 中文在线а√在线8| 国产欧美日韩精品高清二区综合区| 免费观看不卡av| 精品亚洲免a| 亚洲精品成人一区| 欧美高清不卡| 国产精品伦理久久久久久| 日韩一区二区三区在线看| 激情欧美丁香| 精品国产不卡一区二区| 日本一区免费网站| 欧美在线资源| 99久久亚洲精品| 国内自拍视频一区二区三区| 亚洲久久视频| 日韩一区二区久久| 中文字幕系列一区| 精品日韩一区| 国产欧美一区二区三区米奇 | 一本大道色婷婷在线| 欧美激情视频一区二区三区免费 | 日本不卡一二三区黄网| 在线看片不卡| 欧美午夜精彩| 精精国产xxxx视频在线播放| 国语对白精品一区二区| 国产精品v亚洲精品v日韩精品| 中文字幕av一区二区三区人| 黄色亚洲在线| 好看的av在线不卡观看| 少妇精品导航| 日韩黄色大片网站| 国产一区二区色噜噜| 欧美精品导航| 国产视频一区免费看| 九一成人免费视频| 99精品视频精品精品视频| 麻豆精品蜜桃| 99精品在线免费在线观看| 青青青免费在线视频| 国产一区日韩| 成人在线超碰| 激情黄产视频在线免费观看| 久久精品国产精品亚洲毛片| 老司机精品视频在线播放| 国产精品黄网站| 久久久久九九精品影院| 免费在线观看一区| 精品一区二区三区亚洲| 麻豆精品在线观看| 精品久久久中文字幕| 精品国产乱码久久久| 成人午夜在线| 成人日韩在线观看| 久久免费黄色| 亚洲精品在线观看91| 欧美在线网站| 美女网站久久| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲专区视频| 欧美日韩精品一区二区三区视频 | 国产精品一站二站| 精品亚洲a∨一区二区三区18| 精品欧美日韩精品| 综合日韩av| 午夜久久福利| 涩涩涩久久久成人精品| 欧美精品影院| 综合国产视频| 国产精品中文| 成人日韩av| 久久国产精品成人免费观看的软件| 99久久久久久中文字幕一区| 午夜日本精品| 日本一区免费网站| 麻豆精品在线| 欧美日韩视频免费观看| 国产精品88久久久久久| 首页欧美精品中文字幕| 欧美亚洲福利| 亚洲最新无码中文字幕久久| 亚洲精品中文字幕乱码| 日韩三级精品| 精品国产不卡| 欧美日韩激情| 综合国产视频| 久久一区精品| 免费欧美一区| 婷婷综合国产| 福利一区二区免费视频| 精品日韩毛片| 欧美亚洲综合视频| 日韩欧美自拍| 亚洲一二三区视频| 加勒比视频一区| 亚洲欧美日韩国产一区| 国产美女亚洲精品7777| 久久精品免费一区二区三区| 日韩中文字幕91| 久久香蕉网站| 中文久久精品| 麻豆一区二区三| 欧美特黄一区| 久久99国产精品视频| 狠狠干综合网| 国产精品qvod| 黑丝一区二区三区| 欧美韩一区二区| 中文日韩在线| 久久免费视频66| 首页亚洲欧美制服丝腿| 精品无人区麻豆乱码久久久| 亚洲一区二区三区免费在线观看| 国产精品一区二区三区av| 国产一区日韩一区| 欧美久久香蕉| 女人天堂亚洲aⅴ在线观看| 国产精品视频首页| 日韩视频一区| 精品视频高潮| 亚洲久久一区| 久久亚洲成人| 国产精品啊啊啊| 蜜臀av性久久久久蜜臀aⅴ流畅| 高清精品久久|