Shader渲染或者是著色器
阿新 • • 發佈:2019-02-07
shader的公用方法介紹
- Shader.TileMode:幾種渲染平鋪模式
- CLAMP :複製左邊緣和下邊緣的顏色來繪製剩餘的部分
- MIRROR:映象的方式重複圖片的繪製(和我們照鏡子一樣的效果)
- REPEAT:重複圖片繪製(windows設定背景時的平鋪)
這裡介紹下shader是什麼?三種模式是什麼?如何使用的?
- shader就是一個渲染時的著色器,他的使用是繪製時,設定在畫筆上的paint.setShader(bitmapShader); 然後使用畫筆畫圖形時,就會使用相應的shader來繪製(填充)圖形。
- 繪製的圖形就像一個容器,然後不同的shader就在這個容器上填充東西。
還是BitmapShader舉例,如在一張牆上(繪製的圖形),需要貼滿瓷磚(一個瓷磚就是一個位圖),然後瓷磚會按照上面的三種TileMode模式來貼滿整個瓷磚 - 下面的其他幾個shader子類同理,如LinearGradient就是在這個牆上使用顏色填充滿
shader6個子類介紹
- BitmapShader渲染影象,點陣圖渲染就是使用一個位圖來進行渲染(填充)
BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
bitmap:點陣圖填充 、tileX/tileY:x軸y軸填充的模式
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
Paint paint=new Paint();
paint.setColor(Color.GRAY);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.a);
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.MIRROR,Shader.TileMode.MIRROR);
paint.setShader(bitmapShader);
canvas.drawRect(new Rect(0,0,bitmap.getWidth()*3, bitmap.getHeight()*3 ),paint); }
效果圖如下:
- LinearGradient線性渲染,線性渲染就是通過一組顏色值,來填充
LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
x0、y0漸變的起點,x1、y1漸變的結束座標,colors漸變填充的顏色陣列,tile模式
positions:引數表示顏色陣列中值的位置,如果為null則線性填充
一般不設定這個引數,現在不明白這個引數的演算法!
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)
同上,只是這裡把colors陣列換成了2個color0、color1引數,少了positions引數
@Override
public void draw(Canvas canvas) {
Paint paint=new Paint();
paint.setColor(Color.GRAY);
int colors[]={Color.BLACK,Color.RED,Color.GREEN,Color.BLUE};
LinearGradient lg=new LinearGradient(0,0,300,300,colors,null,Shader.TileMode.MIRROR);
paint.setShader(lg);
canvas.drawRect(new Rect(0,0,300, 300),paint);}
效果圖:
- RadialGradient環形渲染
# 環形渲染效果簡單點就是蚊香,一圈一圈,只是蚊香只有一種顏色,而環形渲染有2種或者多種顏色交替渲染,就是圓圈由多種顏色組成
#RadialGradient(float centerX, float centerY, float radius, int[] colors, float[] stops, Shader.TileMode tileMode)
centerX,centerY:這兩個決定渲染時繪製時開始的座標點
radius:代表渲染的圓的圓弧寬度,越小越細(渲染出的圓的圈數就越多)
2個顏色陣列代表渲染時圓的顏色
stops:如果為null表示顏色屬組均勻分佈,這個值和線性渲染的位置引數類似,但是演算法不明白
#RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, Shader.TileMode tileMode)
同上,只是渲染時顏色變成了2個
//第一個建構函式demo
@Override
public void draw(Canvas canvas) {
Paint paint=new Paint();
paint.setColor(Color.GRAY);
int colors[]={Color.BLACK,Color.RED,Color.GREEN,Color.BLUE};
RadialGradient rg=new RadialGradient(150,150,10,Color.RED,Color.BLUE,Shader.TileMode.MIRROR);
RadialGradient rg1=new RadialGradient(150,150,10,colors,null,Shader.TileMode.MIRROR);
paint.setShader(rg1);
canvas.drawRect(new Rect(0,0,300, 300),paint);}
-----------------------分割線-----------------------------------------
//第二個建構函式demo
@Override
public void draw(Canvas canvas) {
Paint paint=new Paint();
paint.setColor(Color.GRAY);
int colors[]={Color.BLACK,Color.RED,Color.GREEN,Color.BLUE};
RadialGradient rg=new RadialGradient(150,150,10,Color.RED,Color.BLUE,Shader.TileMode.MIRROR);
paint.setShader(rg);
canvas.drawRect(new Rect(0,0,300, 300),paint);}
- SweepGradient 梯度渲染(類似雷達掃描)。
SweepGradient(float cx, float cy, int[] colors, float[] positions)
SweepGradient(float cx, float cy, int color0, int color1)
cx、cy確定渲染開始的中心座標
color表示可以是個顏色陣列,color0、color1也可以是單個顏色
positions:null表示均勻渲染,這個引數對應到顏色陣列,表示每個顏色渲染的相對位置演算法暫不知道
@Override
public void draw(Canvas canvas) {
Paint paint=new Paint();
paint.setColor(Color.GRAY);
int colors[]={Color.BLACK,Color.RED,Color.GREEN,Color.BLUE};
SweepGradient sg=new SweepGradient(300,300,colors,null);
paint.setShader(sg);
canvas.drawCircle(300,300,150,paint);}
- ComposeShader 組合渲染(組合其他幾個子類使用)
ComposeShader(Shader shaderA, Shader shaderB, Xfermode mode)
ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)
組合多個shader,其中第二個建構函式的PorterDuff是第一個Xfermode的子類