SkGradientShader::CreateLinear 的参数。
函數聲明:
在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]; 起始點和結束點,影響了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/
轉載于:https://www.cnblogs.com/ezhong/archive/2011/11/24/2261856.html
總結
以上是生活随笔為你收集整理的SkGradientShader::CreateLinear 的参数。的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Intent打开各种类型的文件
 - 下一篇: ad提莫出装推荐(ad提莫出装)