shader渲染器(BitmapShader 、LinearGradient 、RadialGradient )简单介绍

来源:互联网 发布:安东尼上赛季数据 编辑:程序博客网 时间:2024/05/21 10:49

shader 渲染器,有如下四中渲染器
* BitmapShader 位图渲染器
* ComposeShader 组合渲染器
* LinearGradient 线性渲染器
* RadialGradient 环形渲染器
* SweepGradient 梯度渲染器
官方文档介绍如下
Shader is the based class for objects that return horizontal spans of colors during drawing. A subclass of Shader is installed in a Paint calling paint.setShader(shader). After that any object (other than a bitmap) that is drawn with that paint will get its color(s) from the shader.
这段话有几个重点:
1,怎么使用,shader是给paint使用的,paint.setShaer(shader);
2.shader不仅仅是渲染bitmap,还能渲染其他的,比如文字
备注:个人感觉只要paint能画的都能渲染
3.返回水平空白方向的渲染颜色

接下来介绍bitmapshader,shader有三种渲染方式
这个是原图这里写图片描述

  bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.shader)).getBitmap();        int height = bitmap.getHeight();        int width = bitmap.getWidth();        offset = (int) (Math.min(width, height) * 1.7f);  /**         *  bitmap 要渲染的图片         * @param tileX  x轴的渲染模式         * @param tileY  y轴的渲染模式         * 总共有三种渲染模式,xy方向可以混合使用         * Shader.TileMode.CLAMP  最外面的色素平铺填充空白         * Shader.TileMode.MIRROR bitmap为单位镜像填充空白         * Shader.TileMode.REPEAT bitmap为单位复制填充空白         */        BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);        paint.setShader(shader);       canvas.drawRect(new Rect(centerX - offset, centerY -offset,centerX+offset,centerY+offset),paint);

左上角是原图,其他空白区域的效果是渲染出来的
第一种CLAMP 方式的效果:
这里写图片描述

第二种MIRROR 的效果
这里写图片描述

第三种 REPEAT 效果如下:
这里写图片描述

是不是看起来和windows桌面壁纸设置的效果一样的。
用处也很常见的,比如圆形头像,截取外接圆的留下的空白就用bitmapShader去平铺渲染.

接着是线性渲染器LinearGradient 的实例效果,最经典的是windows画板自带的调色板
这里写图片描述

   /**         * 线性渲染器的使用         @param x0   起点         @param y0         @param x1   终点         @param y1         @param  colors   线性渐变的颜色         @param  positions  可以为空,每个颜色占据矩形色块的宽度或者长度,为空是均分         @param  tile        渲染模式三种,平铺、拉伸、镜像         */        int[] color=new int[]{Color.BLUE,Color.BLACK,Color.YELLOW,Color.GREEN,Color.DKGRAY};        LinearGradient linearGradient=new LinearGradient(0,0,450,450,color,null, Shader.TileMode.CLAMP);        paint.setShader(linearGradient);        paint.setAntiAlias(true);        canvas.drawRect(0,0,450,450,paint);

这里写图片描述

下面是圆形渲染器的使用

     /**         * /** Create a shader that draws a radial gradient given the center and radius.         @param centerX  中心点         @param centerY  中心点         @param radius   半径,必须是正数         @param colors   圆形色轮的颜色         @param stops    和线性的一样         @param tileMode The Shader tiling mode         */        int [] color1=new int[]{Color.RED,Color.BLUE};        RadialGradient radialGradient=new RadialGradient(450,450, 400,color1,null, Shader.TileMode.CLAMP);        Paint paint1=new Paint();        paint1.setAntiAlias(true);        paint1.setShader(radialGradient);        canvas.drawRect(0,0,450,450,paint1);

怎么感觉看起来像是日晕呢?
这里写图片描述

改变颜色种类之后效果如下:
这里写图片描述

这里面有一个渐变融合过渡的效果,颜色少看起来是很帅的。

线性的渲染器很多app都用到了,比如酷狗的歌词,比如今日头条的字体渲染显示刷新效果。
那上面到底有么有坑呢?肯定是有的,渲染器至少要求2种颜色以上。
后面的几种渲染器用法差不多,大同小异。

阅读全文
0 0
原创粉丝点击