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

您的位置:首頁技術文章
文章詳情頁

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

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

一、介紹

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

BitmapShader: 位圖渲染

LinearGradient: 線性渲染

SweepGradient: 梯度渲染

RadialGradient: 光束渲染

ComposeShader: 組合渲染

渲染模式:Shader.TileMode

Shader.TileMode.CLAMP: 邊緣拉伸模式,它會拉伸邊緣的一個像素來填充其他區域。

Shader.TileMode.MIRROR: 鏡像模式,通過鏡像變化來填充其他區域。需要注意的是,鏡像模式先進行y軸方向的鏡像操作,然后在進行x軸方向上的鏡像操作。

Shader.TileMode.REPEAT:重復模式,通過復制來填充其他區域

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

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

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

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

二、效果介紹:

1.BitmapShader: 位圖渲染

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

參數:

bitmap:要處理的bitmap對象

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

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

我們給畫筆填充一個五角星,然后繪制一條直線

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是顏色線性漸變的著色器。

構造函數:

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)

參數:

(x0,y0)表示漸變的起點,(x1,y1)表示漸變的終點坐標,這兩點都是相對于屏幕坐標系。

color0,color1分別表示起點的顏色和終點的顏色。

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

colors[]傳入多個顏色值進去

positions[] 位置數組

而且當positions參數傳入null時,代表顏色是均勻的填充整個漸變區域的,顯得比較柔和。

通過兩個構造函數分別畫兩條線:

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是梯度漸變,也稱為掃描式漸變,可以實現雷達掃描效果。

構造函數:

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

參數:

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

顏色漸變是順時針的,從中心點的x軸正方形開始。

注意:這里構造函數并不需要TileMode,因為梯度漸變的邊界相當于無限大的。

構造函數:

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

參數:

colors[]顏色數組

positions數組,該數組中每一個position對應colors數組中每個顏色在360度中的相對位置,

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

通過要個構造函數繪制兩個實心圓,其中第二個圓指定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:創建從中心向四周發散的輻射漸變效果,

構造函數:

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

參數:

centerX 圓心的X坐標

centerY 圓心的Y坐標

radius 圓的半徑

centerColor 中心顏色

edgeColor 邊緣顏色

構造函數:

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

參數:

colors[]傳入多個顏色值進去,這樣就會用colors數組中指定的顏色值一起進行顏色線性插值。

stops數組,該數組中每一個stop對應colors數組中每個顏色在半徑中的相對位置,

stop[]取值范圍為[0,1],0表示圓心位置,1表示圓周位置。如果stops數組為null,那么Android會自動為colors設置等間距的位置。

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);

這里多指定了一個period,設置為漸變的圓心x軸坐標,這樣就可以實現滾動的小球

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

同樣也可以設置繪制的圓心跟隨滾動:將圓心Y軸坐標設置為period,實現小球從上往下掉的效果

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

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

5.ComposeShader: 組合渲染

ComposeShader用來組合不同的Shader,可以將兩個不同的Shader組合在一起

構造函數:

ComposeShader (Shader shaderA, Shader shaderB, Xfermode mode)

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

參數:

shaderA shaderB 兩種渲染效果

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

將bitmapShader和RadialGradient模式復合

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);//混合產生新的Shader.shader[7] = new ComposeShader(shader[0],shader[6],PorterDuff.Mode.DST_IN);paint.setShader(shader[7]);//以新的Shader繪制一個圓。canvas.drawCircle(150,lineHeight,550,paint);

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

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

全部代碼:

//shader 畫筆填充private void my_shader(Canvas canvas){ //Shader.TileMode是指平鋪模式 //Shader.TileMode.CLAMP是邊緣拉伸模式,它會拉伸邊緣的一個像素來填充其他區域。 //Shader.TileMode.MIRROR是鏡像模式,通過鏡像變化來填充其他區域。需要注意的是,鏡像模式先進行y軸方向的鏡像操作,然后在進行x軸方向上的鏡像操作。 //Shader.TileMode.REPEAT是重復模式,通過復制來填充其他區域 //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)表示漸變的起點,(x1,y1)表示漸變的終點坐標,這兩點都是相對于屏幕坐標系。color0,color1分別表示起點的顏色和終點的顏色。 //LinearGradient (float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile) //多色漸變的構造函數中,我們可以傳入多個顏色,和每個顏色的占比。而且當positions參數傳入null時,代表顏色是均勻的填充整個漸變區域的,顯得比較柔和。 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是梯度漸變,也稱為掃描式漸變,效果有點類似與雷達掃描效果。 //SweepGradient(float cx, float cy, int color0, int color1) // (cx,cy)表示漸變效果的中心點,也就是雷達掃描的圓點。color0和color1表示漸變的起點色和終點色。 // 顏色漸變是順時針的,從中心點的x軸正方形開始。 // 注意:這里構造函數并不需要TileMode,因為梯度漸變的邊界相當于無限大的。 //SweepGradient(float cx, float cy,int colors[], float positions[]) //colors[]顏色數組 //positions數組,該數組中每一個position對應colors數組中每個顏色在360度中的相對位置, // position取值范圍為[0,1],0和1都表示3點鐘位置,0.25表示6點鐘位置,0.5表示9點鐘位置,0.75表示12點鐘位置, 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:創建從中心向四周發散的輻射漸變效果,其有兩個構造函數: //RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, Shader.TileMode tileMode) //centerX 圓心的X坐標 //centerY 圓心的Y坐標 //radius 圓的半徑 //centerColor 中心顏色 //edgeColor 邊緣顏色 //RadialGradient(float centerX, float centerY, float radius, int[] colors, float[] stops, Shader.TileMode tileMode) //colors[]傳入多個顏色值進去,這樣就會用colors數組中指定的顏色值一起進行顏色線性插值。 // stops數組,該數組中每一個stop對應colors數組中每個顏色在半徑中的相對位置, // stop[]取值范圍為[0,1],0表示圓心位置,1表示圓周位置。如果stops數組為null,那么Android會自動為colors設置等間距的位置。 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用來組合不同的Shader,可以將兩個不同的Shader組合在一起,它有兩個構造函數: //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); //混合產生新的Shader. shader[7] = new ComposeShader(shader[0],shader[6],PorterDuff.Mode.DST_IN); paint.setShader(shader[7]); //以新的Shader繪制一個圓。 canvas.drawCircle(150,lineHeight,550,paint);}

以上這篇Android Shader著色器/渲染器的用法解析就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩国产一区二| 国内精品99| 一本一本久久| japanese国产精品| 91精品婷婷色在线观看| 中国字幕a在线看韩国电影| 高清av一区| 精品一级视频| 精品国产三区在线| 国产成人精品一区二区三区免费| 欧美交a欧美精品喷水| 国产欧美高清| 欧美激情视频一区二区三区免费 | 日韩毛片视频| 特黄毛片在线观看| 神马日本精品| 亚洲免费播放| 亚洲毛片在线免费| 国产欧美一区二区精品久久久 | 国产精品不卡| 国产v综合v| 不卡av一区二区| 日韩在线观看一区二区| 亚洲ww精品| 国产精品视频一区视频二区| 久久久精品区| 日韩国产一区二区三区| 亚洲第一精品影视| 日韩精品一级二级| 日韩中文字幕无砖| 久久99蜜桃| 久久久久国产一区二区| 久久午夜精品一区二区| 日韩av资源网| 精品国产精品国产偷麻豆| 高清不卡亚洲| 亚洲欧美日韩专区| 国产精品一卡| 99精品在线| 亚洲1区在线观看| 免费日韩一区二区三区| 日韩在线短视频| 美女精品在线观看| 欧美国产亚洲精品| 国产一区久久| 日韩高清不卡一区| 日韩国产网站| 亚洲a成人v| 日韩av免费大片| 91精品亚洲| 亚洲美女久久| 亚洲精品88| 日韩成人精品一区二区三区| 国产一区二区三区不卡视频网站 | 少妇久久久久| 一区二区三区网站| 国产精品久久久久久久久久妞妞| 福利一区和二区| 午夜在线精品| 国产精品成人a在线观看| 石原莉奈在线亚洲三区| 老司机精品视频在线播放| 激情欧美一区| 麻豆久久一区| 日韩中文字幕一区二区三区| 精品久久一区| 亚洲精品欧洲| 精品日韩视频| 国产精品免费99久久久| 欧美日韩国产精品一区二区亚洲| 欧美日韩精品一区二区三区视频| 国产亚洲一区二区手机在线观看 | 国产麻豆精品久久| 国产偷自视频区视频一区二区| 国产精品天堂蜜av在线播放| 国产精品女主播一区二区三区| 福利一区视频| 欧美亚洲免费| 日韩在线观看一区二区| 国产精品亚洲一区二区三区在线观看| 日韩**一区毛片| 久久免费黄色| 精品一区二区三区四区五区| 日韩在线观看一区二区三区| 国产精品99一区二区| 成午夜精品一区二区三区软件| 日韩黄色免费网站| 亚洲深夜av| 久久国产中文字幕| 精品国产第一福利网站| 国产精品一国产精品k频道56| 另类亚洲自拍| 久久精品亚洲欧美日韩精品中文字幕| 国产欧美日韩精品一区二区三区| 六月婷婷一区| 亚洲网站视频| 国产成年精品| 国产极品久久久久久久久波多结野| 亚洲一区日韩在线| 欧美日韩在线播放视频| 91青青国产在线观看精品| 欧美精品aa| 欧美私人啪啪vps| 少妇精品久久久一区二区| 石原莉奈在线亚洲二区| 日韩一区二区免费看| 激情久久久久久| 久久高清精品| 成人久久久久| 欧美黄色网页| 91看片一区| 国内揄拍国内精品久久| 国产精品3区| 国产乱码精品一区二区三区四区 | 久久激情网站| 91亚洲国产成人久久精品| 精品一区二区三区中文字幕| 国产精品国产三级在线观看| 在线精品视频一区| 久久福利毛片| 另类av一区二区| 亚洲在线观看| 国产一区91| 在线亚洲国产精品网站| 欧美日韩国产探花| 亚洲精品电影| 国产亚洲精品v| 免费看的黄色欧美网站| 国产亚洲永久域名| 亚洲欧美日韩精品一区二区 | 成人羞羞在线观看网站| 国产资源在线观看入口av| 麻豆精品一区二区综合av| 免费亚洲一区| 国产一区二区三区成人欧美日韩在线观看| 欧美激情五月| 国产 日韩 欧美 综合 一区| 成人在线免费观看91| 中文字幕在线免费观看视频| 日本а中文在线天堂| 久久精品电影| 黄色亚洲在线| 亚洲三级在线| 国产情侣久久| 日本一二区不卡| 亚洲欧美一区在线| 日韩在线一区二区| 一区二区91| 亚洲精品黄色| 国产精品免费不| 高清不卡亚洲| 欧美大黑bbbbbbbbb在线| 日韩亚洲在线| 日韩动漫一区| 福利片在线一区二区| 1024精品一区二区三区| 日韩中文字幕区一区有砖一区 | 免费在线观看不卡| 欧美在线看片| 成人污污视频| 婷婷亚洲五月| 在线观看亚洲精品福利片| 国产精品一区二区三区四区在线观看| 国产一区二区三区探花| 久久在线电影| 亚洲va久久| 精品国产美女a久久9999| 99视频精品视频高清免费| 人人精品人人爱| 国产精品久久亚洲不卡| 九色porny丨国产首页在线| 午夜一级久久| 国产精品99精品一区二区三区∴| 日韩欧美午夜| 亚洲五月综合| 黄色网一区二区| 99视频精品全部免费在线视频| 亚洲无线观看| 国产一区二区三区久久| 夜夜嗨一区二区三区| 国产精品日本一区二区三区在线| 91tv亚洲精品香蕉国产一区| 美美哒免费高清在线观看视频一区二区 | 国产成人精品一区二区三区视频| 国产精品7m凸凹视频分类| 国产亚洲一区二区三区啪| 午夜精品久久久久久久久久蜜桃| 日韩精品一二三| 成人在线观看免费视频| av亚洲在线观看| 国产欧美在线| 狠狠爱成人网| 精品国产鲁一鲁****| 国产模特精品视频久久久久| 国产精品一线| 国产亚洲激情| 免费看av不卡| 国产精品亲子伦av一区二区三区| 91成人精品视频| 黄色精品视频|