SkGradientShader::CreateLinear 的參數。
函數聲明:
在class SK_API SkGradientShader 中。(include\effects\SkGradientShader.h)
/**
Returns a shader that generates a linear gradient between the two specified
points. <p
/> CreateLinear
returns a shader with a reference count of 1. The
caller should decrement the shader's reference count when done with the shader. It
is an error for count to be < 2. @param
pts The start and end points for the gradient. @param
colors The array[count] of colors, to be distributed between the two points @param
pos May be NULL. array[count] of SkScalars, or NULL, of the relative position of each
corresponding color in the colors array. If this is NULL, the
the colors are distributed evenly between the start and end point. If
this is not null, the values must begin with 0, end with 1.0, and intermediate
values must be strictly increasing. @param
count Must be >=2. The number of colors (and pos if not NULL) entries.
@param
mode The tiling mode @param
mapper May be NULL. Callback to modify the spread of the colors. */ static SkShader*
CreateLinear( const SkPoint
pts[2], const SkColor
colors[], const SkScalar
pos[], int count, SkShader::TileMode
mode, SkUnitMapper*
mapper = NULL); |
SkPoint pts[2]; 起始點和結束點,影響了Gradient的起始位置和過渡完 count個顏色需要的像素。
SkColor colors[] 過渡的顏色表
SkScalar pos[] 過渡色百分比,必須以0開始,以1.0結束,中間值嚴格增長
int count 過渡的顏色數
SkShader::TileMode mode 繪製範圍大於 pts的兩個點指定的距離時的重複模式
SkUnitMapper *mapper ;
舉例一:
pts 分別爲 [0,0]、[50,50], 畫 區域SkRect(0,0,100,100),重複模式kMirror_TileMode,顏色表用紅綠藍白黑
則Gradient過渡完顏色表的顏色時,需要從點(0,0)到點(50,50),Gradient方向是斜向右下45°
範圍(0,0,100,100)超出範圍,重複模式是kMirror_TileMode,鏡像重複
本來是紅綠藍白黑 超出部分挨着就是 黑白藍綠紅 再次 紅綠藍白黑 ……
如果畫圖的範圍小於 (0,0,50,50),就按比例裁剪
畫到(0,0,50,50)是: 畫到(0,0,20,50)則是:
舉例二:
如果pts 起始點不是(0,0),比如(x,y),如果在(x,y)左側有繪製Gradient,則按照 mode模式重複。
pts(50,50),(100,50),方向是從左到右,重複模式kMirror_TileMode,顏色表用紅綠藍白黑
畫(0,0,100,100)是從左到右過渡,從起始點的x座標開始往右50像素是紅綠藍白黑的過渡,
從起始點的x座標(50)開始往左,是右邊的kMirror_TileMode模式的重複:從座標50往左是 紅綠藍白黑。
舉例三:
參數count ,如果小於colors的元素個數,則只取colors的前count個顏色,如果大於,則填充了透明色
(但是如果count比colors的元素個數多了超過1,比如大3,就填充3個空顏色,但是空顏色之間的過渡有顏色)
pts (50,50),(100,50);畫範圍SkRect r = {0,0,SkIntToScalar(200),SkIntToScalar(100)};
如:SkColor colors[] ={SK_ColorRED,SK_ColorGREEN,SK_ColorBLUE,SK_ColorWHITE,SK_ColorBLACK};
//紅、綠、藍、白、黑,這些宏的alpha值都是FF,即不透明
count = SK_ARRAY_COUNT(colors);//5
,count = 2:,count =8:
舉例四:
三種mode的效果圖
例四代碼:
//畫到屏幕上 void Flip() { HDC dc
= GetDC(g_hWnd); SetDIBitsToDevice(dc,
0, 0, 800, 480, 0, 0, 0, 800, pskBitmap->getPixels(), lpbmi, DIB_RGB_COLORS); ReleaseDC(g_hWnd,dc); } void PaintShader() { SkPaint
paint; paint.setAntiAlias( true ); //paint.setStyle(SkPaint::kStroke_Style); //paint.setStrokeWidth(SkScalarHalf(SkIntToScalar(3))); //paint.setStyle(SkPaint::kFill_Style); SkPoint
p = SkPoint::Make(50,50); SkPoint
q = SkPoint::Make(100,50); SkPoint
pts[] ={p,q}; SkScalar
t,temp,x,y; SkColor
colors[] ={ SK_ColorRED,SK_ColorGREEN,SK_ColorBLUE,SK_ColorWHITE,SK_ColorBLACK }; //紅、綠、藍、白、黑,這些宏的alpha值都是FF,即不透明 SkShader
*shader ; shader
=SkGradientShader::CreateLinear( pts,colors,NULL,SK_ARRAY_COUNT(colors),SkShader::kMirror_TileMode); //pts決定Gradient的起始點和走向,以及過渡完gClors的顏色需要的像素距離 paint.setShader(shader); shader->unref(); SkRect
r = {0,0,SkIntToScalar(200),SkIntToScalar(100)}; //
如果r範圍小於pts,則只顯示完整過渡colors需要像素的一部分,如果大於就會按mode重複 //kMirror_TileMode就是紅綠藍白黑+白藍綠紅+綠藍白黑+白...重複 pskCanvas->drawRect(r,paint); shader
=SkGradientShader::CreateLinear( pts,colors,NULL,SK_ARRAY_COUNT(colors),SkShader::kRepeat_TileMode); paint.setShader(shader); shader->ref(); r.setLTRB(0,SkIntToScalar(110),SkIntToScalar(200),SkIntToScalar(210)); pskCanvas->drawRect(r,paint); shader
=SkGradientShader::CreateLinear( pts,colors,NULL,SK_ARRAY_COUNT(colors),SkShader::kClamp_TileMode); paint.setShader(shader); shader->ref(); r.setLTRB(0,SkIntToScalar(220),SkIntToScalar(200),SkIntToScalar(320)); pskCanvas->drawRect(r,paint); } void MyLButtonDown(POINT
pt) { PaintShader(); Flip(); } |
舉例五:
關於constSkScalar pos[]參數,以0開始,以1.0結束,中間值嚴格增長。
我個人理解:constSkColor colors[]中兩個顏色的過渡所佔百分比爲pos[]中對應兩個值的差值
SkColor colors[] ={SK_ColorRED,SK_ColorGREEN,SK_ColorBLUE,SK_ColorWHITE,SK_ColorBLACK};
SkScalar scalars[] ={0.0, 0.2, 0.2, 0.3,1.0};
//紅綠過渡佔20%,綠藍沒有過渡,藍白過渡佔10%,白黑過渡70%(對應值的差)
SkPoint
p = SkPoint::Make(0,50); SkPoint
q = SkPoint::Make(800,50); SkPoint
pts[] ={p,q}; SkColor
colors[] ={ SK_ColorRED,SK_ColorGREEN,SK_ColorBLUE,SK_ColorWHITE,SK_ColorBLACK }; SkScalar
scalars[] ={0.0, 0.2, 0.2, 0.3,1.0}; //紅綠過渡佔20%,綠藍沒有過渡,藍白過渡佔10%,白黑過渡70%(對應值的差) SkShader
*shader ; shader
=SkGradientShader::CreateLinear( pts,colors,scalars,SK_ARRAY_COUNT(colors),SkShader::kMirror_TileMode); //pts決定Gradient的起始點和走向,以及過渡完gClors的顏色需要的像素距離 paint.setShader(shader); shader->unref(); SkRect
r = {0,0,SkIntToScalar(800),SkIntToScalar(100)}; |
pts差值800,就是過渡完5個顏色要800像素, 畫寬帶爲800像素的矩形
紅綠顏色過渡佔0.2(0.2-0),有160像素
綠藍過渡佔0(0.2-0.2) 沒有綠藍過渡區
藍白過渡佔0.1(0.3-0.2) 有80像素
白黑過渡佔0.7(1.0-0.3) 560像素
效果圖:
轉自:ezhong的博客園:http://www.cnblogs.com/ezhong/