mthoutai

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理



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

  

posted on 2017-07-28 18:19  mthoutai  阅读(381)  评论(0编辑  收藏  举报