渲染器 Shader BitmapShader
渲染模式示例代码
public class LinearGradientView extends View { private Paint mPaint = null; private Shader mLinearGradient11 = null; private Shader mLinearGradient12 = null; private Shader mLinearGradient13 = null; private Shader mLinearGradient21 = null; private Shader mLinearGradient22 = null; private Shader mLinearGradient23 = null; private Shader mLinearGradient31 = null; private Shader mLinearGradient32 = null; private Shader mLinearGradient33 = null; public LinearGradientView(Context context) { super(context); // 第一第二个参数表示渐变起点,可以设置在对角等任意位置;第三第四个参数表示渐变终点;第五个参数表示渐变颜色; // 第六个参数可以为空,表示坐标值为0-1 new float[] {0.25f, 0.5f, 0.75f, 1 } 如果为空,颜色均匀分布,沿梯度线。 mLinearGradient11 = new LinearGradient(0, 0, 0, 200, new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.BLACK }, null, TileMode.CLAMP); mLinearGradient12 = new LinearGradient(0, 0, 0, 300, new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.BLACK }, new float[] { 0, 0.1f, 0.5f, 0.5f }, TileMode.CLAMP); mLinearGradient13 = new LinearGradient(0, 0, 0, 400, new int[] { Color.RED, Color.GREEN, Color.BLUE }, null, TileMode.CLAMP); mLinearGradient21 = new LinearGradient(0, 320, 0, 320 + 200, new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.BLACK }, null, TileMode.MIRROR); mLinearGradient22 = new LinearGradient(0, 320, 0, 320 + 100, new int[] { Color.RED, Color.GREEN, Color.BLUE }, null, TileMode.MIRROR); mLinearGradient23 = new LinearGradient(0, 320, 0, 320 + 100, new int[] { Color.RED, Color.GREEN, Color.BLUE }, new float[] { 0, 0.1f, 0.5f }, TileMode.MIRROR); mLinearGradient31 = new LinearGradient(0, 640, 0, 640 + 200, new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.BLACK }, null, TileMode.REPEAT); mLinearGradient32 = new LinearGradient(0, 640, 0, 640 + 100, new int[] { Color.RED, Color.GREEN, Color.BLUE }, null, TileMode.REPEAT); mLinearGradient33 = new LinearGradient(0, 640, 0, 640 + 100, new int[] { Color.RED, Color.GREEN, Color.BLUE }, new float[] { 0, 0.1f, 0.5f }, TileMode.REPEAT); mPaint = new Paint(); } @Override protected void onDraw(Canvas canvas) { //重复最后一个像素 mPaint.setStrokeWidth(2); mPaint.setShader(mLinearGradient11); canvas.drawRect(0, 0, 200, 300, mPaint);//200-300之间全部是最后的黑色 mPaint.setShader(mLinearGradient12); canvas.drawRect(210, 0, 410, 300, mPaint);//0.5之后全部是黑色了 mPaint.setShader(mLinearGradient13); canvas.drawRect(420, 0, 620, 300, mPaint); // LinearGradient的高度小于要绘制的矩形的高度时才会有重复、镜像等效果 canvas.drawLine(0, 310, 720, 310, mPaint); //镜像效果 mPaint.setShader(mLinearGradient21); canvas.drawRect(0, 320, 200, 620, mPaint); mPaint.setShader(mLinearGradient22); canvas.drawRect(210, 320, 410, 620, mPaint); mPaint.setShader(mLinearGradient23); canvas.drawRect(420, 320, 620, 620, mPaint); canvas.drawLine(0, 630, 720, 630, mPaint); //重复效果 mPaint.setShader(mLinearGradient31); canvas.drawRect(0, 640, 200, 940, mPaint); mPaint.setShader(mLinearGradient32); canvas.drawRect(210, 640, 410, 940, mPaint); mPaint.setShader(mLinearGradient33); canvas.drawRect(420, 640, 620, 940, mPaint); } }
渲染器示例代码
public class MyShaderView extends View { // Shader渲染器,专门用来渲染图像以及一些几何图形 private BitmapShader bitmapShader; //bitmap渲染器,主要用来渲染图像 private LinearGradient linearGradient; //线性渲染 private RadialGradient radialGradient; //环形渲染 private SweepGradient sweepGradient; //扫描渐变,围绕一个中心点扫描渐变就像电影里那种雷达扫描,用来梯度渲染 private ComposeShader composeShader; //混合渲染器,可以和其他几个子类组合起来使用 private Bitmap bitmap; /**Bitmap的宽高*/ private int width, height; private Paint paint; /**渐变颜色数组*/ private final int[] colors = { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW }; /**用来指定颜色数组的相对位置,若为null则均匀分布*/ private final float[] positions = null; public MyShaderView(Context context) { super(context); bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.icon)).getBitmap(); width = bitmap.getWidth(); height = bitmap.getHeight(); paint = new Paint(); } @SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.WHITE); //背景色 //将Bitmap截取为圆形、圆角矩形 canvas.drawBitmap(bitmap, 0, 0, paint);//原图 bitmapShader = new BitmapShader(bitmap, TileMode.MIRROR, TileMode.MIRROR); paint.setShader(bitmapShader); canvas.drawOval(new RectF(width, 0, width * 2, height), paint);//圆形渲染图 canvas.drawRoundRect(width * 2, 0, width * 3, height, 30, 30, paint);//矩形渲染图 //绘制线性渐变的矩形 linearGradient = new LinearGradient(0, 200, 400, 400, colors, positions, TileMode.REPEAT);// 渐变起 初点/终点坐标 x/y 位置; paint.setShader(linearGradient); canvas.drawRect(0, 200, 400, 400, paint);//渲染范围最好和图形大小一致 //绘制环形渐变的圆和矩形 radialGradient = new RadialGradient(100, 500, 100, colors, positions, TileMode.REPEAT);// 中心坐标、半径 paint.setShader(radialGradient); canvas.drawCircle(100, 500, 100, paint); canvas.drawRect(200, 400, 300, 600, paint); radialGradient = new RadialGradient(300, 500, 100, colors, positions, TileMode.MIRROR); paint.setShader(radialGradient); canvas.drawCircle(400, 500, 100, paint); canvas.drawRect(500, 400, 600, 600, paint); //绘制梯形渐变的矩形 sweepGradient = new SweepGradient(300, 710, colors, positions);//中心坐标 paint.setShader(sweepGradient); canvas.drawRect(0, 610, 600, 810, paint); //绘制混合渐变(线性与环形混合)的矩形 linearGradient = new LinearGradient(0, 820, 300, 1120, colors, positions, TileMode.REPEAT); composeShader = new ComposeShader(linearGradient, bitmapShader, PorterDuff.Mode.SRC_OVER); paint.setShader(composeShader); canvas.drawRect(0, 820, 600, 1120, paint); } }
渲染器 Shader BitmapShader的更多相关文章
- 通过渲染器Shader实现图像变换效果
在上一篇文章中,一起学习了通过设定画笔风格来实现图形变换,没读过的朋友可以点击下面链接: http://www.cnblogs.com/fuly550871915/p/4886455.html 是不是 ...
- Android渲染器Shader:环状放射渐变渲染器RadialGradient(三)
Android渲染器Shader:环状放射渐变渲染器RadialGradient(三) Android RadialGradient渲染器提供一种环状.发散.放射形状的渐变渲染器. 写一个例子: ...
- Android渲染器Shader:梯度渐变扫描渲染器SweepGradient(二)
Android渲染器Shader:梯度渐变扫描渲染器SweepGradient(二) 附录文章1介绍了线性渐变渲染器. Android的SweepGradient梯度渐变扫描,重点是在构造Swe ...
- Android渲染器Shader:LinearGradient(一)
Android渲染器Shader:LinearGradient(一) LinearGradient是Android的线性渲染器.我写5个LinearGradient渲染器渲染后的View表现结果 ...
- Android Shader渲染器:BitmapShader图片渲染
public class BitmapShader extends Shader BitmapShader, Shader家族的 专门处理图片渲染的 构造方法: public BitmapShade ...
- 关于 android的 渲染器 Shader
因为公司在 自定义的画图上面比较苛刻(各种要求= =),最后又是改来改去的.反正是 Shader起到很大作用,特此记录一下下.在achartengine的基础上没有能满足他们= = androd 提供 ...
- 基于OpenGL编写一个简易的2D渲染框架-09 重构渲染器-Shader
Shader 只是进行一些简单的封装,主要功能: 1.编译着色程序 2.绑定 Uniform 数据 3.根据着色程序的顶点属性传递顶点数据到 GPU 着色程序的编译 GLuint Shader::cr ...
- android 开发 View _13 绘制图片与BitmapShader位图的图像渲染器
BitmapShader位图的图像渲染器 TileMode 模式 Shader.TileMode.CLAMP 边缘拉伸. Shader.TileMode.MIRROR 在水平方向和垂直方向交替景象, ...
- Android学习笔记12:图像渲染(Shader)
在Android中,提供了Shader类专门用来渲染图像以及一些几何图形. Shader类包括了5个直接子类,分别为:BitmapShader.ComposeShader.LinearGradient ...
随机推荐
- Linux中tar命令-C用法
最近写了一个项目,其中用到了tar这个命令,发现在Qt中的file取得路径之后,获得的都是绝对路径,这个时候用tar打包会将绝对路径全部放进去, 可以用tar temp.tar.gz file -C ...
- 安装 php-gd
安装cmd提示不支持GD模块,不能使用缩略图功能,需要安装php-gd 1.安装 php-gd yum list php-gd yum install php-gd 2.重启 httpd servic ...
- ftp文件操作
PHP FTP操作类( 上传.拷贝.移动.删除文件/创建目录 ) 2016-06-01 PHP编程 /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) */ class class_ ...
- Extjs之rowEditing编辑状态时列不对齐
Extjs在使用rowEditing的时候,会在每一列加上editor属性,表示当处于编辑状态时这一列的值是什么类型的,后突然发现在rowEditing处于编辑状态时每一列的宽度边框了,如果列数非常多 ...
- Delphi-CompareStr 函数
函数名称 CompareStr 所在单元 System.SysUtils 函数原型 function CompareStr(const S1, S2: string): Integer; 函数功能 比 ...
- 浅谈iOS视频播放的N种解决方案
简 注册登录 添加关注 作者 Maru2016.03.22 20:46* 写了4349字,被135人关注,获得了207个喜欢 字数1621 阅读2895 评论43 喜欢159 header ...
- c# 接口代码实例
类和接口的实现 接口定义:为一组方法签名指定一个名称的方式. 类实现接口,就一定要提供接口所有方法的实现. 即使抽象类,也要全部实现,但是,它可以把接口方法声明为abstract的,从而把这个接口方法 ...
- 转:搭建Hive的图形界面
原文来自于:http://blog.csdn.net/w13770269691/article/details/17353595 今天想使用一下Hive的图形化工具HWI,我的Hive是0.12.0版 ...
- 转载:关于 Token,你应该知道的十件事
关于 Token,你应该知道的十件事 原文地址:http://alvinzhu.me/blog/2014/08/26/10-things-you-should-know-about-tokens/ 原 ...
- COJ 0990 WZJ的数据结构(负十)
WZJ的数据结构(负十) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 给你一个N个节点的有根树,从1到N编号,根节点为1并给 ...