Shader着色器,用canvas绘制一个图形后,在这个图形内部进行着色。
例如如果你用带有着色器的画笔去绘制一个圆形,那么这个圆形内部就按照你指定的着色器你渲染色彩,着色器可以是图片,也可以是不同颜色按照梯度规律去变化。
在onDraw()里写下面的代码
//构建画笔
Paint mPaint=new Paint();
//构建Shader
SweepGradient mSweepGradient=new SweepGradient(300,300,Color.RED,Color.BLUE);
//给Paint设置Shader
mPaint.setShader(mSweepGradient2);
//使用设置好Shader的Paint去作画
canvas.drawCircle(300, 300, 300, mPaint);
或者
通过shapeDrawable也可以实现类似功能
//构建Shader
SweepGradient mSweepGradient=new SweepGradient(300,300,Color.RED,Color.BLUE);
//构建ShapeDrawable
ShapeDrawable shapeDrawble = new ShapeDrawable(new OvalShape());//传入一个形状圆形、矩形、椭圆
//给画笔设置Shader
shapeDrawble.getPaint().setShader(mShader);
//设置图形边界
shapeDrawble.setBounds(0,0,mWidth,mWidth);
//绘制这个图形
shapeDrawble.draw(canvas);
/**
* bitmap 在渲染器内使用的位图
* tileX The tiling mode for x to draw the bitmap in. 在位图上X方向渲染器平铺模式
* tileY The tiling mode for y to draw the bitmap in. 在位图上Y方向渲染器平铺模式
* TileMode:
* CLAMP :如果渲染器超出原始边界范围,会复制范围内边缘染色。
* REPEAT :横向和纵向的重复渲染器图片,平铺。
* MIRROR :横向和纵向的重复渲染器图片,这个和REPEAT重复方式不一样,他是以镜像方式平铺。
*/
mShader = new BitmapShader(mBitmap,
Shader.TileMode.CLAMP,
Shader.TileMode.CLAMP);
/**
* http://blog.csdn.net/u012702547/article/details/50821044
* x0表示渲染起始位置的x坐标,
* y0表示渲染起始位置的y坐标,
* x1表示渲染结束位置的x坐标,
* 1表示渲染结束位置的y坐标,
* colors表示渲染的颜色,它是一个颜色数组,数组长度必须大于等于2,
* positions表示colors数组中几个颜色的相对位置,是一个float类型的数组,该数组的长度必须与colors数组的长度相同。
* 如果这个参数使用null也可以,这时系统会按照梯度线来均匀分配colors数组中的颜色,
* 最后一个参数则表示平铺方式,有三种,
*/
LinearGradient linearGradient = new LinearGradient(
0, 0,800, 800,mColors, null, Shader.TileMode.REPEAT);
/**
* float x: 圆心X坐标
* float y: 圆心Y坐标
* float radius: 半径
* int[] colors: 渲染颜色数组
* floate[] positions: 相对位置数组,可为null, 若为null,可为null,颜色沿渐变线均匀分布
* Shader.TileMode tile:渲染器平铺模式
*/
RadialGradient mRadialGradient1 = new RadialGradient(
300, 300, 100, mColors, null, Shader.TileMode.CLAMP);
/**
*
* float x: 圆心X坐标
* float y: 圆心Y坐标
* float radius: 半径
* int color0: 圆心颜色
* int color1: 圆边缘颜色
* Shader.TileMode tile:渲染器平铺模式
*/
RadialGradient mRadialGradient2 = new RadialGradient(
100, 300, 300, Color.RED, Color.BLUE, Shader.TileMode.CLAMP);
/**
*
* cx 渲染中心点x 坐标
* cy 渲染中心y 点坐标
* colors 围绕中心渲染的颜色数组,至少要有两种颜色值
* positions 相对位置的颜色数组,可为null, 若为null,可为null,颜色沿渐变线均匀分布
*/
SweepGradient mSweepGradient1=new SweepGradient(
100,300,mColors,null);
/**
* cx 渲染中心点x 坐标
* cy 渲染中心点y 坐标
* color0 起始渲染颜色
* color1 结束渲染颜色
*/
SweepGradient mSweepGradient2=new SweepGradient(300,300,Color.RED,Color.BLUE);
Android 颜色渲染(十) ComposeShader组合渲染
/**
* haderA 渲染器A,Shader及其子类对象
* shaderB 渲染器B,Shader及其子类对象
* mode 两种渲染器组合的模式,Xfermode对象
*/
ComposeShader mComposeShader = new ComposeShader(mBitmapShader, mRadialGradient2, PorterDuff.Mode.MULTIPLY);
mPaint.setShader(mComposeShader);