Android中提供了Shader类专门用来渲染图像以及一些几何图形,Shader下面包括几个直接子类,分别是BitmapShader、ComposeShader、LinearGradient、RadialGradient、SweepGradient。
可以和其它几个子类组合起来使用。
先来说说Shader.TileMode的三种模式:CLAMP、MIRROR和REPETA。
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
// 获取屏幕尺寸数据
screenSize = MeasureUtil.getScreenSize((Activity) context);
mRectF=new RectF();
mRectF.left = 0;
mRectF.right = screenSize[0];
mRectF.top = 0;
mRectF.bottom = screenSize[1];
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a);
bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP,
TileMode.CLAMP);
mPaint.setShader(bitmapShader);
canvas.drawRect(mRectF, mPaint);
效果如图,图片右边和下边 超出图片范围 的都 复制了边缘的颜色:
再来试一下MIRROR:
bitmapShader = new BitmapShader(bitmap, TileMode.MIRROR,
TileMode.MIRROR);
效果如图,超出图片都是镜像:
接着是REPEAT,没什么好说的,就是重复:
看了这三张图,大家应该能理解TileMode的三种模式了。
这个类有两点要注意:
BitmapShader默认是从屏幕的左上角开始绘图的。
我们来做一个测试,将绘图的区域也就是mRectF做一下调整:
mRectF.left = 100;
mRectF.right = screenSize[0]-100;
mRectF.top = 100;
mRectF.bottom = screenSize[1]-100;
bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP,
TileMode.CLAMP);
如果我绘制的图形不从屏幕左上角开始绘制,怎么办?
BitmapShader提供了两个方法:setLocalMatrix(Matrix matrix)和getLocalMatrix(Matrix matrix)。
bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP,TileMode.CLAMP);
// 实例一个矩阵对象
Matrix matrix = new Matrix();
// 设置矩阵变换
matrix.setTranslate(100, 300);
// 设置Shader的变换矩阵
bitmapShader.setLocalMatrix(matrix);
果然,绘制的起始点就从(0,0)变成了(100, 300):
这个比较简单,直接看效果吧:
linearGradient=new LinearGradient(0, 0, 200, 200, Color.RED, Color.GREEN,TileMode.CLAMP);
mPaint.setShader(linearGradient);
canvas.drawRect(0, 0, 400, 400, mPaint);
linearGradient=new LinearGradient(0, 0, 200, 200, Color.RED, Color.GREEN, TileMode.MIRROR);
linearGradient=new LinearGradient(0, 0, 200, 200, Color.RED, Color.GREEN, TileMode.REPEAT);
linearGradient=new LinearGradient(0, 0, 400, 400, new int[]{Color.RED,Color.GREEN,Color.BLUE}, null, TileMode.CLAMP);
linearGradient=new LinearGradient(0, 0, 400, 400, new int[]{Color.RED,Color.GREEN,Color.BLUE}, new float[]{0f,0.9f,1.0f}, TileMode.CLAMP);
根LinearGradient差不多。
radialGradient=new RadialGradient(200, 200, 200, Color.RED, Color.GREEN, TileMode.CLAMP);
radialGradient=new RadialGradient(200, 200, 200, Color.RED, Color.GREEN, TileMode.MIRROR);
radialGradient=new RadialGradient(200, 200, 200, Color.RED, Color.GREEN, TileMode.REPEAT);
radialGradient=new RadialGradient(200, 200, 200, new int[]{Color.RED,Color.GREEN,Color.BLUE}, null, TileMode.CLAMP);
radialGradient=new RadialGradient(200, 200, 200, new int[]{Color.RED,Color.GREEN,Color.BLUE}, new float[]{0f,0.1f,1.0f}, TileMode.CLAMP);
直接上代码:
sweepGradient = new SweepGradient(400, 400, Color.RED, Color.YELLOW);
sweepGradient = new SweepGradient(400, 400, new int[] { Color.RED,
Color.GREEN, Color.BLUE }, null);
- 多种颜色 个性分布
sweepGradient = new SweepGradient(400, 400, new int[] { Color.RED,
Color.GREEN, Color.BLUE, Color.YELLOW }, new float[] { 0,
0.3f, 0.7f, 1.0f });
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a);
mBitmapShader = new BitmapShader(bitmap,Shader.TileMode.REPEAT,Shader.TileMode.MIRROR);
mLinearGradient = new LinearGradient(0, 0, bitmap.getWidth(), bitmap.getHeight(),
new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.WHITE},
null,Shader.TileMode.REPEAT);
mComposeShader = new ComposeShader(mBitmapShader,mLinearGradient,PorterDuff.Mode.DARKEN);
// 获取屏幕尺寸数据
int[] screenSize = MeasureUtil.getScreenSize((Activity) context);
mRectF=new RectF();
mRectF.left = 0;
mRectF.right = screenSize[0];
mRectF.top = 0;
mRectF.bottom = screenSize[1];
mPaint.setShader(mComposeShader);
canvas.drawRect(mRectF, mPaint);
源码下载
引用:
自定义控件其实很简单1/3 - AigeStudio - 博客频道 - CSDN.NET
Android学习笔记进阶15之Shader渲染 - 爱生活,爱编程 - 博客园
关于 android的 渲染器 Shader - 我爱洗澡 皮肤好好, 哦哦哦哦哦哦~ - 博客频道 - CSDN.NET
Android画图Path的使用 - tt_mc - 博客园
android Shader类简介_渲染图像示例 - 低级写手 我自由了 - ITeye技术网站