DrawRect:DrawRect屬于CoreGraphic框架子寓,占用CPU结啼,消耗性能大
CAShapeLayer:CAShapeLayer屬于CoreAnimation框架劈猿,通過GPU來渲染圖形,節(jié)省性能庸蔼。動(dòng)畫渲染直接提交給手機(jī)GPU,不消耗內(nèi)存
貝塞爾曲線與CAShapeLayer的關(guān)系
- CAShapeLayer中shape代表形狀的意思贮匕,所以需要形狀才能生效
2.貝塞爾曲線可以創(chuàng)建基于矢量的路徑
3.貝塞爾曲線給CAShapeLayer提供路徑姐仅,CAShapeLayer在提供的路徑中進(jìn)行渲染。路徑會閉環(huán)刻盐,所以繪制出了shape
4.用于CAShapeLayer的貝塞爾曲線作為path掏膏,其path是一個(gè)首尾相連接的閉環(huán)曲線,即使該貝塞爾曲線不是一個(gè)閉環(huán)的曲線
CAShapeLayer比CALayer做動(dòng)畫更加復(fù)雜敦锌,
普通CALayer在被初始化的時(shí)候是需要給一個(gè)frame的值的馒疹,這個(gè)frame值一般都與給定view的bounds值一致,它本身是有形狀的乙墙,而且是矩形颖变。
CAShapeLayer在初始化的時(shí)候也需要給一個(gè)frame值,但是听想,它本身沒有形狀腥刹,它的形狀來源于你給定的一個(gè)path,然后它去取CGPath值哗魂,它與CALayer有區(qū)別
CAShapeLayer有著幾點(diǎn)很重要:
1.它依附于一個(gè)給定的path肛走,必須給予path,而且录别,即使path不完整也會自動(dòng)首尾相連接
2.storkeStart遺跡strokeEnd代表著在這個(gè)path中所占 用的百分比
- CAShapeLayer動(dòng)畫僅僅限于沿著邊緣的動(dòng)畫效果朽色,它實(shí)現(xiàn)不了填充效果
以下給出如何使用CAShapeLayer實(shí)現(xiàn)畫圓的效果
//創(chuàng)建一個(gè)view
UIView *showView = [[UIViewalloc] initWithFrame:CGRectMake(100,100, 100, 100)];
[self.viewaddSubview:showView];
//showView.backgroundColor = [UIColor redColor];
showView.alpha =0.5;
//bezier曲線
UIBezierPath *path = [UIBezierPathbezierPathWithArcCenter:CGPointMake(100/2.f,100/2.f)radius:100/2.fstartAngle:0endAngle:M_PI *2 clockwise:YES];
//創(chuàng)建一個(gè)shapeLayer
CAShapeLayer *layer = [CAShapeLayerlayer];
layer.frame = showView.bounds;
layer.strokeColor = [UIColorgreenColor].CGColor; //邊緣線的顏色
layer.fillColor = [UIColorclearColor].CGColor; //閉環(huán)填充的顏色
layer.lineCap =kCALineCapSquare; //邊緣線的類型
layer.path = path.CGPath; //從bezier曲線獲取到的形狀
layer.lineWidth =4.0f; //線條寬度
layer.strokeStart =0.0f;
layer.strokeEnd =0.0f;
//將layer添加進(jìn)圖層
[showView.layeraddSublayer:layer];
//3s后執(zhí)行動(dòng)畫操作(直接賦值就能產(chǎn)生動(dòng)畫效果)
[selfperformSelector:@selector(changeStatus:)withObject:layer afterDelay:3.0];
//產(chǎn)生動(dòng)畫效果
- (void)changeStatus:(CAShapeLayer *)layer{
layer.speed =0.1;
layer.strokeStart =0.0;
layer.strokeEnd =1.0f;
layer.lineWidth =4.0f;
}
/*--------------------------------這是分割線------------------------------------------*/
/**********************使用CABasicAnimation(基本動(dòng)畫實(shí)現(xiàn)同樣的效果)*************************/
//給這個(gè)layer添加動(dòng)畫效果
CABasicAnimation *pathAnimation = [CABasicAnimationanimationWithKeyPath:@"strokeEnd"];
pathAnimation.duration =1.0;
pathAnimation.fromValue = [NSNumbernumberWithFloat:0.0f];
pathAnimation.toValue =[NSNumbernumberWithFloat:1.f];
//使視圖保留到最新狀態(tài)
pathAnimation.removedOnCompletion =NO;
pathAnimation.fillMode =kCAFillModeForwards;
[layeraddAnimation:pathAnimation forKey:nil];
關(guān)于cashaplayer的更多介紹:http://blog.csdn.net/mengtnt/article/details/7464187