一、 porterduffxfermode
porterduffxfermode類似于數據集合里面的交集并集概念,只是數據里面取的是兩個集合,而我們這里取的是兩個圖形之間的交集并集,我們先來看一張android api demo里面一張金典的圖
圖中的src和dst相當于是數學中的兩個集合,而在我們的代碼中我們可以這樣來操作這兩個集合
1
2
3
|
canvas.drawsrc(); paint.setxfermode( new porterduffxfermode(porterduff.mode.xxx)); canvas.drawdst(); |
只需要更具我們的需要設置不同的mode即可,從此以后,圓角矩形什么的,那都不是事兒!
二、shader
shader字面意思是著色器、渲染器,有五個子類分別是:
- bitmapshader
- lineargradient
- radialgradient
- sweepgradient
- composeshader
1、bitmapshader:位圖渲染,顧名思義,使用bitmapshader可以對位圖進行一些著色渲染操作
構造方法如下
1
2
3
4
5
6
|
/** * @param bitmap 需要渲染的位圖 * @param tilex x方向渲染模式 * @param tiley y方向渲染模式. */ public bitmapshader(bitmap bitmap, tilemode tilex, tilemode tiley) |
第一個參數不用多說,第二個和第三個渲染模式tilemode有三個可選項
①. clamp:當bitmap比要繪制的圖形小時拉伸位圖的最后一個像素;當bitmap比要繪制的圖形大時,根據繪制圖形剪裁bitmap
1
2
3
|
bitmapshader bitmapshader = new bitmapshader(bitmap, shader.tilemode.clamp, shader.tilemode.clamp); paint.setshader(bitmapshader); canvas.drawrect( 0 , 0 , bitmap.getwidth() * 2 , bitmap.getheight() * 2 , paint); |
1
2
3
4
|
bitmapshader bitmapshader = new bitmapshader(bitmap, shader.tilemode.clamp, shader.tilemode.clamp); paint.setshader(bitmapshader); rectf rect = new rectf( 100 , 100 , 300 , 300 ); canvas.drawroundrect(rect, 30 , 30 ,paint); |
②. repeat :當bitmap比要繪制的圖形小時橫向縱向不斷重復bitmap;當bitmap比要繪制的圖形大時,根據繪制圖形剪裁bitmap
bitmapshader bitmapshader = new bitmapshader(bitmap, shader.tilemode.repeat, shader.tilemode.repeat);
paint.setshader(bitmapshader);
canvas.drawrect(0, 0, bitmap.getwidth() *2, bitmap.getheight() * 2, paint);
③. mirror :和repeat 類似,當bitmap比要繪制的圖形小時橫向縱向不斷重復bitmap,不同的是相鄰的兩個bitmap互為鏡像
1
2
3
|
bitmapshader bitmapshader = new bitmapshader(bitmap, shader.tilemode.mirror, shader.tilemode.mirror); paint.setshader(bitmapshader); canvas.drawrect( 0 , 0 , bitmap.getwidth() * 4 , bitmap.getheight() * 4 , paint); |
熟悉bitmapshader之后,圓角圖片、圓形頭像什么的就更easy了
1.lineargradient 線性漸變
先來看下它的構造方法
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/** * 創建一個lineargradient @param x0 起始x坐標 @param y0 起始y坐標 @param x1 結束x坐標 @param y1 結束y坐標 @param color0 起始顏色值 @param color1 結束顏色值 @param tile shader的mode */ public lineargradient( float x0, float y0, float x1, float y1, int color0, int color1,tilemode tile) lineargradient( float x0, float y0, float x1, float y1, int [] colors, float [] positions, shader.tilemode tile) |
兩個構造方法類似,第二個只是可以添加更多顏色,把顏色值封裝到了數組colors中,其后的positions是與之colors對于的顏色的比例,如果為null,顏色值則平均分布。
lineargradient和bitmapshader一樣有三個tilemode可選clamp、repeat、mirror。實現的效果如下:
① clamp
lineargradient lg = new lineargradient(0, 0, 300, 300, 0xffff0000, 0xff0000ff, shader.tilemode.clamp);
paint.setshader(lg);
canvas.drawrect(0, 0, canvas.getwidth(), canvas.getheight(), paint);
② repeat
1
2
3
|
lineargradient lg = new lineargradient( 0 , 0 , 300 , 300 , 0xffff0000 , 0xff0000ff , shader.tilemode.repeat); paint.setshader(lg); canvas.drawrect( 0 , 0 , canvas.getwidth(), canvas.getheight(), paint); |
③ mirror
1
2
3
|
lineargradient lg = new lineargradient( 0 , 0 , 300 , 300 , 0xffff0000 , 0xff0000ff , shader.tilemode.mirror); paint.setshader(lg); canvas.drawrect( 0 , 0 , canvas.getwidth(), canvas.getheight(), paint); |
還有三個shader沒有介紹,感覺篇幅有點長了,留到下一篇再給大家講解,希望大家繼續關注。