SkGradientShader::CreateLinear 的参数。
函數(shù)聲明:
在class SK_API SkGradientShader 中。(include\effects\SkGradientShader.h)
/** Returns a shader that generates a linear gradient between the twospecified 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 ofeach 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, andintermediate 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]; 起始點(diǎn)和結(jié)束點(diǎn),影響了Gradient的起始位置和過(guò)渡完 count個(gè)顏色需要的像素。
SkColor colors[] 過(guò)渡的顏色表
SkScalar pos[] 過(guò)渡色百分比,必須以0開(kāi)始,以1.0結(jié)束,中間值嚴(yán)格增長(zhǎng)
int count ? 過(guò)渡的顏色數(shù)
SkShader::TileMode mode 繪制范圍大于 pts的兩個(gè)點(diǎn)指定的距離時(shí)的重復(fù)模式
SkUnitMapper *mapper ;
舉例一:
pts 分別為 [0,0]、[50,50], 畫(huà) 區(qū)域SkRect(0,0,100,100),重復(fù)模式kMirror_TileMode,顏色表用紅綠藍(lán)白黑
則Gradient過(guò)渡完顏色表的顏色時(shí),需要從點(diǎn)(0,0)到點(diǎn)(50,50),Gradient方向是斜向右下45°
范圍(0,0,100,100)超出范圍,重復(fù)模式是kMirror_TileMode,鏡像重復(fù) ?
本來(lái)是紅綠藍(lán)白黑 超出部分挨著就是 ?黑白藍(lán)綠紅 再次 紅綠藍(lán)白黑 ……
? ?
如果畫(huà)圖的范圍小于 (0,0,50,50),就按比例裁剪
畫(huà)到(0,0,50,50)是: 畫(huà)到(0,0,20,50)則是:
舉例二:
如果pts 起始點(diǎn)不是(0,0),比如(x,y),如果在(x,y)左側(cè)有繪制Gradient,則按照 mode模式重復(fù)。
pts(50,50),(100,50),方向是從左到右,重復(fù)模式kMirror_TileMode,顏色表用紅綠藍(lán)白黑
畫(huà)(0,0,100,100)是從左到右過(guò)渡,從起始點(diǎn)的x坐標(biāo)開(kāi)始往右50像素是紅綠藍(lán)白黑的過(guò)渡,
從起始點(diǎn)的x坐標(biāo)(50)開(kāi)始往左,是右邊的kMirror_TileMode模式的重復(fù):從坐標(biāo)50往左是 紅綠藍(lán)白黑。
舉例三:
參數(shù)count ,如果小于colors的元素個(gè)數(shù),則只取colors的前count個(gè)顏色,如果大于,則填充了透明色
(但是如果count比colors的元素個(gè)數(shù)多了超過(guò)1,比如大3,就填充3個(gè)空顏色,但是空顏色之間的過(guò)渡有顏色)
pts (50,50),(100,50);畫(huà)范圍SkRect r = {0,0,SkIntToScalar(200),SkIntToScalar(100)};
如:SkColor colors[] ={SK_ColorRED,SK_ColorGREEN,SK_ColorBLUE,SK_ColorWHITE,SK_ColorBLACK};
//紅、綠、藍(lán)、白、黑,這些宏的alpha值都是FF,即不透明
count = SK_ARRAY_COUNT(colors);//5
?,count = ?2:,count =8:
?
舉例四:
三種mode的效果圖
例四代碼:
//畫(huà)到屏幕上 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};//紅、綠、藍(lán)、白、黑,這些宏的alpha值都是FF,即不透明SkShader *shader ;shader =SkGradientShader::CreateLinear(pts,colors,NULL,SK_ARRAY_COUNT(colors),SkShader::kMirror_TileMode);//pts決定Gradient的起始點(diǎn)和走向,以及過(guò)渡完gClors的顏色需要的像素距離paint.setShader(shader);shader->unref();SkRect r = {0,0,SkIntToScalar(200),SkIntToScalar(100)};// 如果r范圍小于pts,則只顯示完整過(guò)渡colors需要像素的一部分,如果大于就會(huì)按mode重復(fù)//kMirror_TileMode就是紅綠藍(lán)白黑+白藍(lán)綠紅+綠藍(lán)白黑+白...重復(fù)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();}舉例五:
關(guān)于constSkScalar pos[]參數(shù),以0開(kāi)始,以1.0結(jié)束,中間值嚴(yán)格增長(zhǎng)。
我個(gè)人理解:constSkColor colors[]中兩個(gè)顏色的過(guò)渡所占百分比為pos[]中對(duì)應(yīng)兩個(gè)值的差值
SkColor colors[] ={SK_ColorRED,SK_ColorGREEN,SK_ColorBLUE,SK_ColorWHITE,SK_ColorBLACK};
SkScalar scalars[] ={0.0, 0.2, 0.2, 0.3,1.0};
//紅綠過(guò)渡占20%,綠藍(lán)沒(méi)有過(guò)渡,藍(lán)白過(guò)渡占10%,白黑過(guò)渡70%(對(duì)應(yīng)值的差)
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};//紅綠過(guò)渡占20%,綠藍(lán)沒(méi)有過(guò)渡,藍(lán)白過(guò)渡占10%,白黑過(guò)渡70%(對(duì)應(yīng)值的差)SkShader *shader ;shader =SkGradientShader::CreateLinear(pts,colors,scalars,SK_ARRAY_COUNT(colors),SkShader::kMirror_TileMode);//pts決定Gradient的起始點(diǎn)和走向,以及過(guò)渡完gClors的顏色需要的像素距離paint.setShader(shader);shader->unref();SkRect r = {0,0,SkIntToScalar(800),SkIntToScalar(100)};
pts差值800,就是過(guò)渡完5個(gè)顏色要800像素, 畫(huà)寬帶為800像素的矩形
紅綠顏色過(guò)渡占0.2(0.2-0),有160像素
綠藍(lán)過(guò)渡占0(0.2-0.2) 沒(méi)有綠藍(lán)過(guò)渡區(qū)
藍(lán)白過(guò)渡占0.1(0.3-0.2) 有80像素
白黑過(guò)渡占0.7(1.0-0.3) 560像素
效果圖:
?
?
ezhong的博客園:http://www.cnblogs.com/ezhong/
轉(zhuǎn)載于:https://www.cnblogs.com/ezhong/archive/2011/11/24/2261856.html
總結(jié)
以上是生活随笔為你收集整理的SkGradientShader::CreateLinear 的参数。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Intent打开各种类型的文件
- 下一篇: Power Designer的使用