倒计时动画

早些时间,在简书闲逛的时候看到了一篇关于载入LodingView的动画,便默默的收藏了。正好公司接下来的项目要用到,顺手写了一个倒计时的动画。
其实构造十分的简单,由几根粗线条填充点颜色,加上一个路径就构成了这个倒计时。
简单看来就是这样:
第一种是顺时针减小的倒计时:

第二种是逆时针减小的倒计时:

下面上代码分析一下:
这里顺时针减小的时候矩形和圆形我都是用CAShapeLayer这个类来做的。

  //顺时针画矩形_rectShapeLayer = [CAShapeLayer layer];_rectShapeLayer.strokeStart = 0.0f;_rectShapeLayer.strokeEnd = 1.0f;UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.bounds];_rectShapeLayer.path = path.CGPath;_rectShapeLayer.fillColor = [UIColor clearColor].CGColor;_rectShapeLayer.lineWidth = 2.0f;_rectShapeLayer.strokeColor = [UIColor redColor].CGColor;[self.layer addSublayer:_rectShapeLayer];//画圆_circleLayer = [CAShapeLayer layer];_circleLayer.strokeStart = 0.0f;_circleLayer.strokeEnd = 1.0f;UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.frame.size.width/2, self.frame.size.height/2) radius:self.frame.size.width / 2 startAngle:0 endAngle:2*M_PI clockwise:_closewire];_circleLayer.path = path.CGPath;_circleLayer.fillColor = [UIColor clearColor].CGColor;_circleLayer.lineWidth = 2.0f;_circleLayer.strokeColor = [UIColor redColor].CGColor;[self.layer addSublayer:_circleLayer];

CAShapeLayer能够做的东西有很多,比CALayer要丰富些。
CAShapeLayer其实用来画弧形是比较好用的,比用CGContextRef去画要简单明了一些。
实现动画的部分我使用CABasicAnimation来实现的,因为其属性比较简单实用,然后参考了一些大神的博客。

//矩形的动画
CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:_closewire?kClockwiseRectAnimationKey:kAntiClockwiseRectAnimationKey];basicAnimation.fromValue = @(0.0);basicAnimation.toValue =  _closewire?@(1.0):@(4.0);basicAnimation.duration = _duration;basicAnimation.fillMode = kCAFillModeForwards;basicAnimation.removedOnCompletion = YES;basicAnimation.delegate = self;if (_closewire) [_rectShapeLayer addAnimation:basicAnimation forKey:nil];else [self.rectLayer addAnimation:basicAnimation forKey:nil];
//圆的动画
CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:@"strokeStart"];basicAnimation.fromValue = @(0.0);basicAnimation.toValue = @(1.0);basicAnimation.duration = _duration;basicAnimation.fillMode = kCAFillModeForwards;basicAnimation.removedOnCompletion = YES;basicAnimation.delegate = self;[_circleLayer addAnimation:basicAnimation forKey:nil];

由于顺时针和逆时针的关系,矩形用CAShapeLayer来绘制的时候只能顺时针减小,所以在逆时针的时候我用了drawInContext方法去绘制,而圆则简单许多,在UIBezierPath的类方法中有画圆的详细设置,顺时针和逆时针都能很方便的设置。
矩形逆时针减小的绘制:

UIBezierPath *path = [UIBezierPath bezierPath];//第一段if (self.progress >= 0 && self.progress <= 1) {CGFloat changeX1 = (1- self.progress) * (self.frame.size.width);[path moveToPoint:CGPointMake(0, 0)];[path addLineToPoint:CGPointMake(changeX1, 0)];[path moveToPoint:CGPointMake(0,  self.frame.size.height)];[path addLineToPoint:CGPointMake( 0, 0)];[path moveToPoint:CGPointMake( self.frame.size.width, self.frame.size.height)];[path addLineToPoint:CGPointMake(0, self.frame.size.height)];[path moveToPoint:CGPointMake(self.frame.size.width, 0)];[path addLineToPoint:CGPointMake(self.frame.size.width,self.frame.size.height)];}//第二段if (self.progress >= 1 && self.progress <= 2) {CGFloat changeY1 = (self.progress - 1) *self.frame.size.height;[path moveToPoint:CGPointMake(0 ,self.frame.size.height)];[path addLineToPoint:CGPointMake(0, changeY1)];[path moveToPoint:CGPointMake( self.frame.size.width, self.frame.size.height)];[path addLineToPoint:CGPointMake(0, self.frame.size.height)];[path moveToPoint:CGPointMake(self.frame.size.width, 0)];[path addLineToPoint:CGPointMake(self.frame.size.width,self.frame.size.height)];}//第三段if (self.progress >= 2 && self.progress <= 3) {CGFloat changeX2 = (self.progress - 2) *(self.frame.size.width);[path moveToPoint:CGPointMake(self.frame.size.width, self.frame.size.height)];[path addLineToPoint:CGPointMake(changeX2, self.frame.size.height)];[path moveToPoint:CGPointMake(self.frame.size.width, 0)];[path addLineToPoint:CGPointMake(self.frame.size.width,self.frame.size.height)];}//第四段if (self.progress >= 3 && self.progress <= 4) {CGFloat changeY2 = (4 - self.progress) *self.frame.size.height;[path moveToPoint:CGPointMake( self.frame.size.width, 0)];[path addLineToPoint:CGPointMake(self.frame.size.width, changeY2)];}CGContextAddPath(context, path.CGPath);CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);CGContextSetLineWidth(context, 2.0);CGContextStrokePath(context);

通过改变其中需要变化的数值,并不断地去绘制,这样就得到一个不断减小的图形。
demo我已上传,需要的同学可以去下载:
顺时针、逆时针两种方式减小的倒计时动画

顺时针、逆时针两种方式减小的倒计时动画相关推荐

  1. React-Router4 嵌套路由实现的两种方式以及路由过渡动画的实现方式

    刚学习react的路由 一个小的后台管理demo 目录结构 // 后台管理页面通常有两种布局方式 // 一种是没有导航栏的 登录页面 // 一种是含有导航栏的 各功能性页面 // 导航栏不需要每次都渲 ...

  2. iOS两种方式实现淡入淡出动画

    一 使用转场动画CATransition实现, 其中type 需要使用kCATransitionFade CATransition *transition = [[CATransition alloc ...

  3. Java格式化倒计时的两种方式

    Java格式化倒计时的两种方式 第一种方式 /*** 入参是一个每秒减小1的秒数* 返回一个格式化的时间* * 该方法具有局限性,他在时间大于1个小时的时候,会返回错误的时间* 因为该方法调用了Dat ...

  4. 两种方式(goto语句以及while循环)实现C语言关机小程序

    用C语言写的关机小程序简单易懂,可以拿去整蛊室友同学(每天一个挨打小技巧),下面我就给出两种方式实现这个代码,欢迎大家讨论补充. 1.用goto语句实现: #include <stdio.h&g ...

  5. python有两个运行程序分别是什么_运行python程序的两种方式

    [单选题]I wonder why ________ are so interested in action movies. [单选题]项目经理的职责不包括以下哪项内容 ? [简答题]结合项目的特点和 ...

  6. 如何计算机车启动牵引力,机车启动的两种方式

    <机车启动的两种方式>由会员分享,可在线阅读,更多相关<机车启动的两种方式(3页珍藏版)>请在人人文库网上搜索. 1.机车的两种启动方式1. 机车以恒定功率启动的运动过程由公式 ...

  7. Eclipse安装SVN插件的两种方式

    登录 | 注册 收藏成功 确定 收藏失败,请重新收藏 确定 查看所有私信查看所有通知 暂没有新通知 想要绕过微信小程序开发中的坑吗?不妨来听这个,今晚8点,1小时帮你搞定! 23小时以前 CSDN日报 ...

  8. 继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错? springboot 两种方式稳定解决跨域问题

    继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错???springboot 两种方式稳定解决跨域问题! 之前我写了一篇文章,来解决CORS报错 ...

  9. 周一02.3运行python程序的两种方式

    一.运行python程序的两种方式 方法一:交互式:                      优点:输入一行代码立刻返回结果                       缺点:无法永久保存代码 方法 ...

  10. 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...

最新文章

  1. Java后端职业规划,附学习笔记+面试整理+进阶书籍
  2. 阿里平头哥科学家亲述 RISC-V 2019 Summit 十大心得!
  3. 从Android应用程序访问Internet需要什么权限?
  4. php定时任务管理,Zebra-Crontab
  5. 23种设计模式(二十三)行为变化之访问器
  6. Nginx双机热备实现方案(双主热备模式)
  7. NYOJ a problem is easy
  8. 黑马程序员全套Java教程_Java基础入门视频教程零基础自学Java必备教程视频讲义(4)
  9. ev3编码软件linux,乐高ev3编程软件下载
  10. (java)word转html并提取word中的目录结构树生成到html页面中的左边树
  11. python爬虫,用scrapy爬取天天基金
  12. xp计算机如何查看内存大小,windowsxp系统下如何查看电脑内存条最大频率
  13. 计算机处理器性能排名,2018电脑英特尔处理器排名(cpu性能天梯图)
  14. nginx.conf配置外部 .conf文件
  15. java红宝石是哪本_AES Java编码,红宝石解码
  16. ZJM与生日礼物【字典树】
  17. 小程序开通直播的思路总结
  18. charles系列破解激活办法(最高charles4.2都可以激活)
  19. JavaScript 实现动物识别专家系统交互演示
  20. 上海11.15特大火灾唱响生命绝唱

热门文章

  1. html5作品欣赏,8个超棒的HTML5网站设计欣赏
  2. OpenXml 之 Excel 复制插入行
  3. day_05 运算符 if和while的使用
  4. 数字藏品NFT用的国内联盟链有哪些?
  5. 移动通信网络的构成思维导图
  6. 怎樣制作线段动画_教程:如何制作一个绘制线条动画
  7. 北达科他州立大学计算机科学专业,2019上海软科世界一流学科排名计算机科学与工程专业排名北达科他州立大学排名第201-300...
  8. (免费配音软件)[配音助手 更新] (1.3版本) 阿里云配音软件
  9. 《酒干倘卖无》歌曲什么意思,看了《搭错车》感人电影就知道了
  10. 电脑桌面计算机图标下不显示文字,电脑桌面图标下面的文字有时会突然不见,然后 – 手机爱问...