接著上篇文章繼續(xù)說(shuō)。在上文中我們把蠟燭繪制完织咧,也講到在K線中常見(jiàn)的幾種圖形:
- 蠟燭
- OHLC
- 線段
- 帶狀
- 圓形
那在這篇文章里胀葱,我們把其余的也繪制一下,爭(zhēng)取做一個(gè)基礎(chǔ)的類(lèi)庫(kù)笙蒙,這樣在開(kāi)發(fā)框架時(shí)就可以直接使用抵屿。
OHLC圖
先上兩張效果圖:
如圖所示,它是由4個(gè)數(shù)據(jù)生成:開(kāi)盤(pán)捅位、收盤(pán)轧葛、最高、最低艇搀。中間的線是最高點(diǎn)至最低點(diǎn)連接而成尿扯,兩邊的分別是開(kāi)盤(pán)點(diǎn)和收盤(pán)點(diǎn)與中間線連接而成。
OK焰雕,知道思路以后衷笋,直接上代碼:
/**
生成OHLC
@param model 蠟燭坐標(biāo)模型
@return 返回圖層
*/
+ (CAShapeLayer *)getOHLCLayerWithPointModel:(YKCandlePointModel *)model
{
//判斷是否為漲跌
BOOL isRed = model.oPoint.y >= model.cPoint.y ? YES : NO;
UIBezierPath *path = [UIBezierPath bezierPath];
//繪制上下影線
[path moveToPoint:model.lPoint];
[path addLineToPoint:model.hPoint];
//開(kāi)盤(pán)線
[path moveToPoint:model.oPoint];
[path addLineToPoint:CGPointMake(model.oPoint.x -6, model.oPoint.y)];
//開(kāi)盤(pán)線
[path moveToPoint:model.cPoint];
[path addLineToPoint:CGPointMake(model.cPoint.x +6, model.cPoint.y)];
CAShapeLayer *layer = [CAShapeLayer layer];
layer.path = path.CGPath;
//判斷漲跌來(lái)設(shè)置顏色
if (isRed)
{
//漲,設(shè)置紅色
layer.strokeColor = [UIColor redColor].CGColor;
} else
{
//跌矩屁,設(shè)置綠色
layer.strokeColor = [UIColor greenColor].CGColor;
}
layer.fillColor = [UIColor clearColor].CGColor;
return layer;
}
單辟宗、多條線
效果圖:
上圖中的淡綠色、粉色吝秕、黃色線就是我們所要繪制的泊脐,這里再解釋一下為什么標(biāo)題是單、多條線烁峭,因?yàn)樵谟械腒線指標(biāo)中規(guī)定某一個(gè)值是用一條連續(xù)的線段表示容客;但有的指標(biāo)數(shù)值中間會(huì)有無(wú)效值,那無(wú)效值就不會(huì)連接约郁,這樣的話這條線段就是不連續(xù)的缩挑,形成多條線。
其實(shí)在分時(shí)線繪制的時(shí)候棍现,也說(shuō)過(guò)如何繪制一條線,這里就不再贅述了镜遣,直接上代碼:
單條線工具類(lèi):
/**
生成單條線
@param pointArr 坐標(biāo)點(diǎn)數(shù)組
@param lineColor 線顏色
@return 返回線段圖層
*/
+ (CAShapeLayer *)getSingleLineLayerWithPointArray:(NSArray *)pointArr lineColor:(UIColor *)lineColor
{
UIBezierPath *path = [UIBezierPath getBezierPathWithPointArr:pointArr];
CAShapeLayer *layer = [CAShapeLayer layer];
layer.path = path.CGPath;
layer.lineWidth = 1.f;
layer.strokeColor = lineColor.CGColor;
layer.fillColor = [UIColor clearColor].CGColor;
return layer;
}
多條線工具類(lèi):
/**
生成包含多條線的線段
@param pointArr 坐標(biāo)點(diǎn)數(shù)組
@param lineColor 線顏色
@return 返回線段圖層
*/
+ (CAShapeLayer *)getMultipleLineLayerWithPointArray:(NSArray *)pointArr lineColor:(UIColor *)lineColor
{
UIBezierPath *path = [UIBezierPath bezierPath];
for (int idxX=0; idxX<pointArr.count; idxX++)
{
NSArray *idxXArr = pointArr[idxX];
[path moveToPoint:[[idxXArr firstObject] CGPointValue]];
for (int idxY=1; idxY<idxXArr.count; idxY++)
{
[path addLineToPoint:[idxXArr[idxY] CGPointValue]];
}
}
CAShapeLayer *layer = [CAShapeLayer layer];
layer.path = path.CGPath;
layer.lineWidth = 1.f;
layer.strokeColor = lineColor.CGColor;
layer.fillColor = [UIColor clearColor].CGColor;
return layer;
}
圓形
接下來(lái)是圓形己肮,圓形就比較簡(jiǎn)單了士袄,就是那么一個(gè)單純的圓。只是在開(kāi)發(fā)中谎僻,一般都是由多個(gè)圓形成一定的趨勢(shì)娄柳。
這里直接上代碼:
/**
生成圓
@param point 圓心坐標(biāo)
@param color 圓顏色
@return 返回圖層
*/
+ (CAShapeLayer *)getCircleLayerWithPoint:(CGPoint )point color:(UIColor *)color
{
//直接用圓描述路徑
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:point radius:3.f startAngle:0.f
endAngle:(CGFloat)M_PI * 2 clockwise:true];
//生成圖層 并設(shè)置路徑和屬性
CAShapeLayer *layer = [CAShapeLayer layer];
layer.path = path.CGPath;
layer.fillColor = color.CGColor;
layer.strokeColor = color.CGColor;
return layer;
}
帶狀
這里要說(shuō)明一下,帶狀這種圖形用文字?jǐn)⑹霾磺宄疑埽枰Y(jié)合實(shí)際的數(shù)據(jù)才能理解赤拒。所以這里就先不寫(xiě)Demo,等到后面我們?cè)诳蚣苤薪尤雽?shí)際數(shù)據(jù)了诱鞠,再詳述挎挖。
繪制效果
上面光發(fā)代碼了,這里把最后的運(yùn)行結(jié)果發(fā)上來(lái):
需要源碼的點(diǎn)擊這里航夺。