CAShapeLayer动画(画圆效果)


关于CAShapeLayer和DrawRect的比较
DrawRect:DrawRect属于CoreGraphic框架,占用CPU,消耗性能大
CAShapeLayer:CAShapeLayer属于CoreAnimation框架,通过GPU来渲染图形,节省性能。动画渲染直接提交给手机GPU,不消耗内存

贝塞尔曲线与CAShapeLayer的关系
1,CAShapeLayer中shape代表形状的意思,所以需要形状才能生效
2,贝塞尔曲线可以创建基于矢量的路径
3,贝塞尔曲线给CAShapeLayer提供路径,CAShapeLayer在提供的路径中进行渲染。路径会闭环,所以绘制出了Shape
4,用于CAShapeLayer的贝塞尔曲线作为Path,其path是一个首尾相接的闭环的曲线,即使该贝塞尔曲线不是一个闭环的曲线

CAShapeLayer比CALayer做动画更加复杂,

普通CALayer在被初始化时是需要给一个frame值的,这个frame值一般都与给定view的bounds值一致,它本身是有形状的,而且是矩形.

CAShapeLayer在初始化时也需要给一个frame值,但是,它本身没有形状,它的形状来源于你给定的一个path,然后它去取CGPath值,它与CALayer有着很大的区别

CAShapeLayer有着几点很重要:

1. 它依附于一个给定的path,必须给与path,而且,即使path不完整也会自动首尾相接

2. strokeStart以及strokeEnd代表着在这个path中所占用的百分比

3. CAShapeLayer动画仅仅限于沿着边缘的动画效果,它实现不了填充效果


以下给出如何使用CAShapeLayer(想要实现画圆的效果)

 //创建一个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];

    

    //创建一个shapeLayer

    CAShapeLayer *layer = [CAShapeLayerlayer];

    layer.frame = showView.bounds;

    layer.strokeColor = [UIColorgreenColor].CGColor//边缘线的颜色

    layer.fillColor = [UIColorclearColor].CGColor;   //闭环填充的颜色

    layer.lineCap =kCALineCapSquare;                  //边缘线的类型

    layer.path = path.CGPath;                         //bezier曲线获取到的形状

    layer.lineWidth =4.0f;                            //线条宽度

    layer.strokeStart =0.0f;

    layer.strokeEnd =0.0f;

    

    //layer添加进图层

    [showView.layeraddSublayer:layer];

    

    //3s后执行动画操作(直接赋值就能产生动画效果)

    [selfperformSelector:@selector(changeStatus:)withObject:layer afterDelay:3.0];


    //产生动画效果

- (void)changeStatus:(CAShapeLayer *)layer{

    

    layer.speed =0.1;

    layer.strokeStart =0.0;

    layer.strokeEnd =1.0f;

    layer.lineWidth =4.0f;

    

}


    /*--------------------------------这是分割线------------------------------------------*/

    /**********************使用CABasicAnimation(基本动画实现同样的效果)*************************/

    

    //给这个layer添加动画效果

    CABasicAnimation *pathAnimation = [CABasicAnimationanimationWithKeyPath:@"strokeEnd"];

    pathAnimation.duration =1.0;

    pathAnimation.fromValue = [NSNumbernumberWithFloat:0.0f];

    pathAnimation.toValue =[NSNumbernumberWithFloat:1.f];

    //使视图保留到最新状态

    pathAnimation.removedOnCompletion =NO;

    pathAnimation.fillMode =kCAFillModeForwards;


    [layeraddAnimation:pathAnimation forKey:nil];




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值