Shader.TileMode

CompseShader

ComposeShader can only contain shaders of different types (a BitmapShader and a LinearGradient for instance, but not two instances of BitmapShader)‘. But, ‘If your application is affected by any of these missing features or limitations, you can turn off hardware acceleration for just the affected portion of your application by calling setLayerType(View.LAYER_TYPE_SOFTWARE, null).

ComposeShader是一个 混合渲染,可以和其它几个子类组合起来使用:

  • BitmapShader主要用来渲染图像,
  • LinearGradient 用来进行梯度渲染,
  • RadialGradient 用来进行环形渲染,
  • SweepGradient 用来进行扇形梯度渲染,和RadialGradient 渐变方向不同是: SweepGradient 颜色渐变方向非环形,而是以某点为圆心呈扇形扫过

LineerGradient, RadialGradient, SweepGradient 等类的基类为Shader。Shader 定义了一个与之对应的Local Matrix ,可以对Shader 做坐标变换。

/* 这里理解为混合渲染*/
mComposeShader = new ComposeShader(mBitmapShader,mLinearGradient, PorterDuff.Mode.DARKEN);

  1. an Xfermode subclass
    • Xfermode子类可以改变这种行为:
      1)AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。
      2)PixelXorXfermode  当覆盖已有的颜色时,应用一个简单的像素XOR操作。
      3)PorterDuffXfermode  这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。
  2. a combining PorterDuff mode

    • private static final Xfermode[] sModes = {
      new PorterDuffXfermode(PorterDuff.Mode.CLEAR), //eraser
      new PorterDuffXfermode(PorterDuff.Mode.SRC),
      new PorterDuffXfermode(PorterDuff.Mode.DST),
      new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),
      new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),
      new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),
      new PorterDuffXfermode(PorterDuff.Mode.DST_IN),
      new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),
      new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),
      new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),
      new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),
      new PorterDuffXfermode(PorterDuff.Mode.XOR),
      new PorterDuffXfermode(PorterDuff.Mode.DARKEN),
      new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),
      new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),
      new PorterDuffXfermode(PorterDuff.Mode.SCREEN)
      };

Porter Duff Color Filter 也可以为Alpha Composting,指当在将一幅图像绘制在已有背景图像时如果融合前景和背景颜色的过程。Porter Duffer 定义了多种模式,每种模式使用不同的前景和背景色组合算法:

环形渐变

setShader

要在绘图的时候使用一个Shader,可以使用setShader方法将其应用到一个Paint中,如下面的代码所示:

Paint shaderPaint = new Paint();
shaderPaint.setShader(myLinearGradient);

你使用这个Paint所绘制的任何东西都将使用你指定的Shader进行填充,而不是使用Paint本身的颜色进行填充。

TileMode

RadialGradient radialGradientShader = new RadialGradient(centerX,centerY, radius,
gradientColors,
gradientPositions,
TileMode.CLAMP);

如果Shader画刷所定义的区域比要填充的区域小,那么TileMode将会决定如何处理剩余的区域:

  • CLAMP  使用Shader的边界颜色来填充剩余的空间。
  • MIRROR  在水平和垂直方向上拉伸Shader图像,这样每一个图像就都能与上一个缝合了。
  • REPEAT  在水平和垂直方向上重复Shader图像,但不拉伸它。

使用MaskFilter

MaskFilter类可以为Paint分配边缘效果

对MaskFilter的扩展可以对一个Paint边缘的alpha通道应用转换。Android包含了下面几种MaskFilter:

  • BlurMaskFilter   指定了一个模糊的样式和半径来处理Paint的边缘
  • EmbossMaskFilter  指定了光源的方向和环境光强度来添加浮雕效果。

要应用一个MaskFilter,可以使用setMaskFilter方法,并传递给它一个MaskFilter对象。下面的例子是对一个已经存在的Paint应用一个EmbossMaskFilter:

// 设置光源的方向
float[] direction = new float[]{ 1, 1, 1 };
//设置环境光亮度
float light = 0.4f;
// 选择要应用的反射等级
float specular = 6;
// 向mask应用一定级别的模糊
float blur = 3.5f;
EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);   //direction 定义了光源的方向,light 定义光的亮度, specular定义光的等级,blur模糊度。
// 应用mask
myPaint.setMaskFilter(emboss);

maskFilter = new BlurMaskFilter(10, BlurMaskFilter.Blur.SOLID);
ColorFilter
MaskFilter是对一个Paint的alpha通道的转换,而ColorFilter则是对每一个RGB通道应用转换。所有由ColorFilter所派生的类在执行它们的转换时,都会忽略alpha通道。

Android包含三个ColorFilter:

  • ColorMatrixColorFilter  可以指定一个4×5的ColorMatrix并将其应用到一个Paint中。ColorMatrixes通常在程序中用于对图像进行处理,而且由于它们支持使用矩阵相乘的方法来执行链接转换,所以它们很有用。
  • LightingColorFilter  乘以第一个颜色的RGB通道,然后加上第二个颜色。每一次转换的结果都限制在0到255之间。
  • PorterDuffColorFilter  可以使用数字图像合成的16条Porter-Duff 规则中的任意一条来向Paint应用一个指定的颜色。

使用setColorFilter方法应用ColorFilter,如下所示:

myPaint.setColorFilter(new LightingColorFilter(Color.BLUE, Color.RED));

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

生活在西班牙

自己动手丰衣足食

BlueAsteroid

Just another WordPress.com site

Jing's Blog

Just another WordPress.com site

Start from here......

我的心情魔方

天才遠私廚

希望能做一個分享各種資訊的好地方

语义噪声

西瓜大丸子汤的博客

笑对人生,傲立寰宇

Just another WordPress.com site

Where On Earth Is Waldo?

A Project By Melanie Coles

the Serious Computer Vision Blog

A blog about computer vision and serious stuff

Cauthy's Blog

paper review...

Cornell Computer Vision Seminar Blog

Blog for CS 7670 - Special Topics in Computer Vision

datarazzi

Life through nerd-colored glasses

Luciana Haill

Brainwaves Augmenting Consciousness

槑烎

1,2,∞

Dr Paul Tennent

and the university of nottingham

turn off the lights, please

A bunch of random, thinned and stateless thoughts around the Web

%d bloggers like this: