渲染模式:
tileX tileY:The tiling mode for x/y to draw the bitmap in.   在位图上 X/Y 方向 瓦工/花砖/瓷砖 模式
CLAMP  :如果渲染器超出原始边界范围,会复制范围内【边缘】染色
REPEA  :横向和纵向的【重复】渲染器图片,平铺
MIRROR:横向和纵向的重复渲染器图片,这个和REPEAT 重复方式不一样,他是以【镜像】方式平铺  

渲染模式示例代码

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的更多相关文章

  1. 通过渲染器Shader实现图像变换效果

    在上一篇文章中,一起学习了通过设定画笔风格来实现图形变换,没读过的朋友可以点击下面链接: http://www.cnblogs.com/fuly550871915/p/4886455.html 是不是 ...

  2. Android渲染器Shader:环状放射渐变渲染器RadialGradient(三)

     Android渲染器Shader:环状放射渐变渲染器RadialGradient(三) Android RadialGradient渲染器提供一种环状.发散.放射形状的渐变渲染器. 写一个例子: ...

  3. Android渲染器Shader:梯度渐变扫描渲染器SweepGradient(二)

     Android渲染器Shader:梯度渐变扫描渲染器SweepGradient(二) 附录文章1介绍了线性渐变渲染器. Android的SweepGradient梯度渐变扫描,重点是在构造Swe ...

  4. Android渲染器Shader:LinearGradient(一)

     Android渲染器Shader:LinearGradient(一) LinearGradient是Android的线性渲染器.我写5个LinearGradient渲染器渲染后的View表现结果 ...

  5. Android Shader渲染器:BitmapShader图片渲染

    public class BitmapShader extends Shader BitmapShader,  Shader家族的 专门处理图片渲染的 构造方法: public BitmapShade ...

  6. 关于 android的 渲染器 Shader

    因为公司在 自定义的画图上面比较苛刻(各种要求= =),最后又是改来改去的.反正是 Shader起到很大作用,特此记录一下下.在achartengine的基础上没有能满足他们= = androd 提供 ...

  7. 基于OpenGL编写一个简易的2D渲染框架-09 重构渲染器-Shader

    Shader 只是进行一些简单的封装,主要功能: 1.编译着色程序 2.绑定 Uniform 数据 3.根据着色程序的顶点属性传递顶点数据到 GPU 着色程序的编译 GLuint Shader::cr ...

  8. android 开发 View _13 绘制图片与BitmapShader位图的图像渲染器

    BitmapShader位图的图像渲染器 TileMode 模式 Shader.TileMode.CLAMP 边缘拉伸. Shader.TileMode.MIRROR 在水平方向和垂直方向交替景象, ...

  9. Android学习笔记12:图像渲染(Shader)

    在Android中,提供了Shader类专门用来渲染图像以及一些几何图形. Shader类包括了5个直接子类,分别为:BitmapShader.ComposeShader.LinearGradient ...

随机推荐

  1. JavaScript的“闭包”到底是什么(2)

    我的上篇博客标题不对,造成一些误解.我认为博客的宗旨不是背教科书,而是分享研发心得.我的上篇标题因该改成“JavaScript 闭包的一个议题:它对outer scope 的影响”,因为我没有严格地去 ...

  2. javascript读取xml的方法【转载】

    jquery读取xml文件 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

  3. jquey复选框三级分类关联一二级分类

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Category_Manag ...

  4. 理解O/R Mapping

    本文的目的是以最精炼的语言,理解什么是O/R Mapping,为什么要O/R Mapping,和如何进行O/R Mapping. 什么是O/R Mapping? 广义上,ORM指的是面向对象的对象模型 ...

  5. 终端编写c程序

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:JackAlan链接:http://www.zhihu.com/question/21483375/answer/322672 ...

  6. 初谈使用Spring的感受

    我记得刚开始学Spring的时候,只是很自然的把它当做一个类似其他J2EE的框架来学习.那时候学Spring很大一部分是为了以后面试需要,因为毕竟搞Java的,你说不会Spring这都有点说不过去.当 ...

  7. 用java模拟银行柜台排队

    4年前在办理银行业务的时候,看到每个办理柜台窗口前都有很多人排队. 同时在那个时间段,我正好重温了数据结构这本书.好像里面有提到银行. 所以当时就用java写了一段小程序来模拟窗口排队的情况. 有兴趣 ...

  8. hdu 4550 卡片游戏

    http://acm.hdu.edu.cn/showproblem.php?pid=4550 贪心 #include <cstdio> #include <cstring> # ...

  9. 如何让Qt 的程序等待一段时间(等待的同时,还让主界面刷新图片)good

    后面这种方法可以不影响其他线程的响应,又可以达到等待的目的. 测试的一个小例子: class Widget : public QWidget { Q_OBJECT public: Widget(QWi ...

  10. mybatis insertUseGeneratedKeys

    mybatis中的一个坑:预期:传入的Record中会生动填入在db中生成的id值. 使用  insertUseGeneratedKeys插入数据时,如果id字段不是AUTO_INCREMENT,则不 ...