• Android Shader 颜色、图像渲染 paint.setXfermode




    Shader 

           Shader是一个基类,表示在绘制期间颜色的水平跨度

           它的子类被嵌入在Paint中使用,调用paint.setShader(shader)

           除Bitmap外的其他对象,使用该Paint进行绘制时。将从shader中获得颜色


    Shader.TileMode 渲染模式

    public enum TileMode { 
        CLAMP   (0),
        REPEAT  (1),
        MIRROR  (2);
        TileMode(int nativeInt) {
            this.nativeInt = nativeInt;
        }
        final int nativeInt;
    }
      CLAMP:假设超出原始bounds(即原图的边界)。则反复边缘上的color

      REPEAT:反复bitmap

      MIRROR:反复bitmap,与REPEAT不同的时,它是镜像反复,即:反向反复


    Shader 子类:   

       BitmapShader (android.graphics)  图像渲染
       ComposeShader (android.graphics)  组合渲染
       LinearGradient (android.graphics)  线性渲染
       RadialGradient (android.graphics)   环形渲染
       SweepGradient (android.graphics)  扫描渲染


    BitmapShader

       new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.MIRROR); 以某个渲染模式 进行 图像渲染


    ComposeShader

       new ComposeShader(shaderA, shaderB, PorterDuff.Mode.DST); 组合两种渲染效果。以PorterDuff.Mode进行组合


    LinearGradient

      new LinearGradient(0, 0, bitmap.getWidth(), bitmap.getHeight(), 0x470000ff,0xefffff00, Shader.TileMode.CLAMP); 

          在一定区域内。以某种渲染模式,进行两种颜色间的线性变化

      new LinearGradient(0, 0, bitmap.getWidth(), bitmap.getHeight(), new int[]{0xffabc777, 0x2300ff00, 0x470000ff, 0xefffff00}, new float[]{0.1f, 0.3f, 0.5f, 1.0f}, Shader.TileMode.CLAMP)。

         在一定区域内,以某种渲染模式。进行一组颜色间的线性变化。变化的位置由float数组决定。要求int数组和float数组。长度一致

      

    RadialGradient

       以点(x,y),半径为r。进行环形渲染

       new RadialGradient(w/2, h/2, Math.min(w, h) /2, 0xddff00f0, 0xffabc777, Shader.TileMode.REPEAT);

       new RadialGradient(w/2, h/2, Math.min(w, h) /2, new int[]{0xddff0000, 0x2300ff00, 0x470000ff, 0xffabc777}, new float[]{0.1f, 0.3f, 0.5f, 1.0f}, Shader.TileMode.CLAMP);


    SweepGradient

      以点(x,y),进行扫描渲染 

       new SweepGradient(w/2, h/2, 0xddff00f0, 0xffabc777);

       new SweepGradient(w, h, new int[]{0xffff0000, 0xff00ff00, 0xff0000ff, 0xffabc777, 0xffee00ee}, new float[]{0.2f, 0.4f, 0.6f, 0.75f, 1f});


    PorterDuff.Mode


    canvas.drawBitmap(mDstB, 0, 0, paint);//先绘制目标
    paint.setXfermode(sModes[i]);// 使用mode  
    //paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    canvas.drawBitmap(mSrcB, 0, 0, paint);//再绘制源paint.setXfermode(null);//清除mode

      

  • 相关阅读:
    解决HTML乱码
    <img> 标签的 src 属性
    tomcat 启动报错 解决办法 A child container failed during&nbsp
    SpringMVC拦截器(资源和权限管理)
    Java实现文件上传-按钮弹出上传页面
    Socket规划中的局域网内测试
    iOS pragma mark要使用
    dwz 照片回头处理
    图像显示和逐渐消失
    讲座:采用Store检查邮件(1)
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7251827.html
Copyright © 2020-2023  润新知