iOS 实现闪电动画效果

作者: 鑫龙魂 | 来源:发表于2016-07-29 18:36 被阅读876次

看到手机中天气闪电效果挺炫酷的,就想试着实现其效果,费了一番功夫,实现了大致的效果,还有许多地方需要改进.

使用到的有UIBezierPath,CAShapeLayer,CABasicAnimation,CAAnimationGroup等.

实现的大致思路,就是需要绘制出闪电的路径,包括主干路径和分支路径,最后添加动画效果.

要想绘制路径就需要知道路径的点,在网上搜索到一个方法可以得到闪电的路径的点.如下:

/**

*  设置闪电的主干的点

*/

- (void)setupLightPointArrWithStartPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint displace:(CGFloat)displace

{

CGFloat midX = startPoint.x;

CGFloat midY = startPoint.y;

[pointArr removeAllObjects];

[pointArr addObject:NSStringFromCGPoint(startPoint)];

while (midY < endPoint.y)

{

if (startPoint.x <  kScreenWidth/2 )

{

midX += (arc4random()%3 - 0.5)*displace;

midY += (arc4random()%5 - 0.5)*displace;

}else

{

midX -= (arc4random()%3 - 0.5)*displace;

midY += (arc4random()%5 - 0.5)*displace;

}

[pointArr addObject:NSStringFromCGPoint(CGPointMake(midX, midY))];

}

}

其中闪电分支的获取点也是如此.

注意:其中分支的起点是主干上的点.当然也可以不是.

需要的点都已经获取到了,就需要绘制了.

/**

*  设置闪电的路径

*/

- (void)setupLightningPath

{

UIBezierPath *path = [UIBezierPath bezierPath];

[bezierPathArr addObject:path];

CGPoint point ;

for (int i = 0; i < pointArr.count; i ++)

{

point = CGPointFromString(pointArr[i]);

if (i == 0)

{

//画线,设置起点

[path moveToPoint:point];

}else

{

//设置第二个条线的终点,会自动把上一个终点当做起点

[path addLineToPoint:point];

}

NSLog(@"-----point%@ ",NSStringFromCGPoint(point));

if ([branchLightningStartPointArr containsObject:NSStringFromCGPoint(point)])

{

NSMutableArray *branchPointArr = [self setupBranchLightningPathPointWithStartPoint:CGPointMake(point.x, point.y) endPoint:CGPointMake(point.x + 100, point.y + 100) displace:1];

UIBezierPath *branchPath = [UIBezierPath bezierPath];

CGPoint branchPoint;

for (int j = 0; j < branchPointArr.count; j ++)

{

branchPoint = CGPointFromString(branchPointArr[j]);

if (j == 0)

{

//画线,设置起点

[branchPath moveToPoint:branchPoint];

}else

{

//设置第二个条线的终点,会自动把上一个终点当做起点

[branchPath addLineToPoint:branchPoint];

}

}

[bezierPathArr addObject:branchPath];

}

}

}

闪电的路径绘制完成以后就需要实现其动画效果.

/**

*  设置闪电的动画效果

*/

- (void)setupLightningAnimation

{

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

pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];

pathAnimation.duration = 0.2;

pathAnimation.fromValue = [NSNumber numberWithFloat:0.0f];

pathAnimation.toValue = [NSNumber numberWithFloat:1.0f];

pathAnimation.repeatCount = 1;

//透明度

CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];

opacityAnimation.fromValue = [NSNumber numberWithFloat:1.0];

opacityAnimation.toValue = [NSNumber numberWithFloat:0.0];

CAAnimationGroup *groupAnimation = [CAAnimationGroup animation];

groupAnimation.duration = 1.0;

groupAnimation.animations = @[[self opacityForever_Animation:0.1], pathAnimation,opacityAnimation];

groupAnimation.autoreverses = YES;

groupAnimation.repeatCount = 1;

for (int i = 0; i < bezierPathArr.count; i ++)

{

UIBezierPath *path = bezierPathArr[i];

CAShapeLayer *pathLayer = [CAShapeLayer layer];

pathLayer.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame));

pathLayer.path = path.CGPath;

pathLayer.strokeColor = [[UIColor whiteColor] CGColor];

pathLayer.fillColor = nil;

pathLayer.lineWidth = (i == 0?1.0f:0.5);

pathLayer.lineJoin = kCALineJoinMiter;

[self.layer addSublayer:pathLayer];

[pathLayer addAnimation:groupAnimation forKey:@"xxx"];

}

}

至此动画简单的闪电效果已经完成了.还有许多地方需要继续完善.

更新了demo效果如下:

iOS 实现闪电动画效果

上传到了Github:https://github.com/ITXIN/AnimationShow

相关文章

  • iOS 实现闪电动画效果

    看到手机中天气闪电效果挺炫酷的,就想试着实现其效果,费了一番功夫,实现了大致的效果,还有许多地方需要改进. 使用到...

  • ios 电商demo(实现各种常见动画效果和页面布局)

    ios 电商demo(实现各种常见动画效果和页面布局) ios 电商demo(实现各种常见动画效果和页面布局)

  • UIView动画合集

    iOS开发-UIView之动画效果的实现方法(合集) 前言:在开发APP中,我们会经常使用到动画效果。使用动画可以...

  • iOS动画-认识CoreAnimation

    前言 在iOS中,普通的动画可以使用UIKit提供的方法来实现动画,但如果想要实现复杂的动画效果,使用CoreAn...

  • iOS 私有动画的使用

    ios的画面切换的动画效果的API主要通过调用系统已定义的动画效果实现,这些效果已基本囊括开发的需求,如果需要更加...

  • 谈谈iOS中粘性动画以及果冻效果的实现

    谈谈iOS中粘性动画以及果冻效果的实现 2015-06-18 09:05编辑:lansekuangtu分类:iOS...

  • iOS动画的基础知识

    前言 相信大部份iOS开发者在实现一些基础动画时会感叹动画API的简便及动画效果的真实性,动画是iOS的一大...

  • 小白学习ios动画效果

    小白学习ios动画效果 引言 最近公司的设计师很有空,时不时就来问一下某些动画效果好不好实现, 就学习了一下ios...

  • iOS动画之UIView动画

    iOS酷炫的动画效果可以很好的增强用户体验。在iOS开发中实现动画的方式有多种,一般而言,简单的动画使用UIKit...

  • 解析 iOS 动画原理与实现

    这篇文章不会教大家如何实现一个具体的动画效果,我会从动画的本质出发,来说说 iOS 动画的原理与实现方式。 什么是...

网友评论

  • visual_:请问,模拟器导航栏上显示的46m是怎么弄出来的啊
    visual_:@鑫龙魂 谢谢 cool
    鑫龙魂:@MacChark 使用了FBMemoryProfiler

本文标题:iOS 实现闪电动画效果

本文链接:https://www.haomeiwen.com/subject/ibszjttx.html