Shader的介绍

Shader着色器,用canvas绘制一个图形后,在这个图形内部进行着色。

例如如果你用带有着色器的画笔去绘制一个圆形,那么这个圆形内部就按照你指定的着色器你渲染色彩,着色器可以是图片,也可以是不同颜色按照梯度规律去变化。

分类

  1. BitmapShader :图片贴图效果
  2. LinearGradient:线性渐变色效果
  3. RadialGradient:环形渐变色效果
  4. SweepGradient:雷达扫描效果
  5. ComposeShader:以上效果的任意组合

基本用法

在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);

API介绍

BitmapShader:图片贴图效果

 /**
    * 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);

LinearGradient:线性渐变色效果

/**
    * 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);

RadialGradient:环形渐变色效果

    /**
    * 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);

SweepGradient:雷达扫描效果

  /**
    *
    * 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);

ComposeShader:以上效果的任意组合

Android 颜色渲染(十) ComposeShader组合渲染

/**
* haderA    渲染器A,Shader及其子类对象
* shaderB   渲染器B,Shader及其子类对象
* mode   两种渲染器组合的模式,Xfermode对象
*/
ComposeShader mComposeShader = new ComposeShader(mBitmapShader, mRadialGradient2, PorterDuff.Mode.MULTIPLY);

  mPaint.setShader(mComposeShader);

你可能感兴趣的:(自定义View)