一、 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没有介绍,感觉篇幅有点长了,留到下一篇再给大家讲解,希望大家继续关注。