本文主要是介绍[转]Skia之二 —— SkPaint 篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SkPaint
/** \class SkPaint The SkPaint class holds the style and color information about how to draw paint1.setColor(0xFFFF0000: paint1.setStyle(SkPaint::kFill_Style); paint2.setStrokeWidth(SkIntToScalar(3)); paint3.setColor(0xFF888888); paint3.setTextSize(SkIntToScalar(24)); paint3.setTextScaleX(SkFloatToScalar(0.75f)); |
以上显示了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 { |
void const { { // so our destructor won't complain this //delete this |
以上shader多调用unref(),已经删除shader所指向的对象,所以后面的drawRect没有效果。
参考:
http://www.cnblogs.com/ezhong/tag/skia/
这篇关于[转]Skia之二 —— SkPaint 篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!