SkPaint
/** \class SkPaint
The SkPaint class holds the style and color information about how to draw
|
以上显示了3种不同的paint,每个指定一种不同的风格,调用者可以自由的混用他们,也可以在使用的时候修改他们的状态
canvas.drawRect(..., paint1);
canvas.drawRect(..., paint2);
canvas.drawText(..., paint3);
paint3.setColor(0xFF0000FF);
canvas.drawText(..., paint3);
|
除了颜色、笔画、字体大小这样的简单属性,paint也支持effect,effect是绘图管线不同方面的子类,(每个effect都是引用计数的)当一个effect被一个paint引用的时候,将会覆盖paint的绘制管线的一些部分。
例如 ,使用gradient代替单个也是,给paint指定一个SkShader
SkShader* shader = SkGradientShader::CreateLinear(...);
paint.setShader(shader);
shader->unref();
|
现在,所有使用这个paint绘制的东西都会使用由CreateLiner指定的gradient,CreateLiner返回的Shader对象是引用计数的。当一个像shader这样的effect对象被指定给一个paint的时候,paint会增加他的引用计数,为了平衡引用计数,上面的例子调用了shader的unref(),现在这个paint就是shader的唯一拥有者,这样,无论是出了paint作用域或者指定了其他的shader(可以为空),会自动调用shader的unref()。
有6种effect可以绑定到paint:
SkPathEffect
SkRasterizer
SkMaskFilter
SkMaskFilter的使用介绍:http://www.cnblogs.com/ezhong/archive/2011/11/30/2269501.html
SkShader 例如三种过渡色方式(linear,radial,sweep),重复模式(clamp,repeat,mirror)
linear方式GradientShader的使用介绍: http://www.cnblogs.com/ezhong/archive/2011/11/24/2261856.html
SkColorFilter
SkXfermode
paint也保持SkTypeface的引用,SkTypeface代表指定的字体风格,可以用来测量和绘制文字,也就是说不仅可以用于绘制文本,还可以用来测量文本
paint.measureText(...);
paint.getTextBounds(...);
paint.textToGlyphs(...);
paint.getFontMetrics(...);
|
======================================================================
备注:关于引用计数
SkShder 继承于 SkFlattenable,SkFlattenable继承于SkRefCnt
SkRefCnt 的成员函数 ref()和unref() 分别将fRefCnt递增1,递减1
|
void
const
{
|
以上shader多调用unref(),已经删除shader所指向的对象,所以后面的drawRect没有效果。
参考:
http://www.cnblogs.com/ezhong/tag/skia/