1. 程式人生 > >Shader渲染或者是著色器

Shader渲染或者是著色器

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的子類