咖啡伴侣

呆在上海
posts - 163, comments - 156, trackbacks - 0, articles - 2

高级画布绘图(2)

Posted on 2011-07-26 11:33 oathleo 阅读(281) 评论(0)  编辑  收藏 所属分类: Android

11.4.3  高级画布绘图(2)

提示:

图11-1中没有包含的是ComposerShader,它可以创建多个Shader和BitmapShader的组合,从而可以在一个位图图像的基础上创建一个绘图刷。

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

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

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

定义渐变Shader

如上所示,使用渐变Shader可以让你使用交替改变的颜色来填充图片;你可以将颜色渐变定义为两种颜色的简单交替,如下所示:

  1. int colorFrom = Color.BLACK;  
  2. int colorTo = Color.WHITE;  
  3.  
  4. LinearGradient linearGradientShader = new LinearGradient(x1, y1, x2, y2,  
  5.                                                          colorFrom,  
  6.                                                          colorTo,  
  7.                                                          TileMode.CLAMP); 

或者,你还可以定义更复杂的按照设定比例进行分布的颜色序列,如下面的RadialGradientShader例子所示:

  1. int[] gradientColors = new int[3];  
  2. gradientColors[0] = Color.GREEN;  
  3. gradientColors[1] = Color.YELLOW;  
  4. gradientColors[2] = Color.RED;  
  5.  
  6. float[] gradientPositions = new float[3];  
  7. gradientPositions[0] = 0.0f;  
  8. gradientPositions[1] = 0.5f;  
  9. gradientPositions[2] = 1.0f;  
  10.  
  11. RadialGradient radialGradientShader=new RadialGradient(centerX,centerY, radius,  
  12.                                                          gradientColors,  
  13.                                                          gradientPositions,  
  14.                                                          TileMode.CLAMP); 

每一种渐变Shader(线性的、辐射形的和扫描状的)都可以使用以上这两种技术来定义渐变填充。

使用Shader TileModes

渐变Shader的画刷大小既可以显式地使用有边界的矩形来定义,也可以使用中心点和半径长度来定义。Bitmap Shader可以通过它的位图大小来决定它的画刷大小。

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

CLAMP  使用Shader的边界颜色来填充剩余的空间。

MIRROR  在水平和垂直方向上拉伸Shader图像,这样每一个图像就都能与上一个缝合了。

REPEAT  在水平和垂直方向上重复Shader图像,但不拉伸它。

使用MaskFilter

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

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

BlurMaskFilter   指定了一个模糊的样式和半径来处理Paint的边缘。

EmbossMaskFilter  指定了光源的方向和环境光强度来添加浮雕效果。

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

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

SDK中包含的FingerPaint API demo是说明如何使用MaskFilter的一个非常好的例子。它展示了这两种filter的效果。

使用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));

API中的ColorMatrixSample是说明如何使用ColorFilter和Color Matrix的非常好的例子。

使用PathEffect

到目前为止,所有的效应都会影响到Paint填充图像的方式;PathEffect是用来控制绘制轮廓(线条)的方式。

PathEffect对于绘制Path基本图形特别有用,但是它们也可以应用到任何Paint中从而影响线条绘制的方式。

使用PathEffect,可以改变一个形状的边角的外观并且控制轮廓的外表。Android包含了多个PathEffect,包括:

CornerPathEffect  可以使用圆角来代替尖锐的角从而对基本图形的形状尖锐的边角进行平滑。


只有注册用户登录后才能发表评论。


网站导航: