时间:2021-05-20
前言
我们平时在用支付宝付款时,会有一个支付中的动画和一个支付完成的动画。这篇博客主要分析一下这种动画效果,效果如下:
支付宝支付动画
一、动画解析
为了方便观察,放慢了动画的速度并添加辅助线:
放慢后的动画
从图中可以看出:加载圆弧运动轨迹可分为前半段和后半段;并且圆弧的起始角度(StartAngle)和结束角度(EndAngle)在做有规律的变化;
前半段: 从-0.5π到π,这一段运动中速度较快;StartAngle不变,始终未-0.5π;EndAngle在匀速上升,一直到π;前半段中圆弧不断变长,最后形成一个3/4的圆。
后半段: 从π到1.5π,这一段运动速度较慢;StartAngle开始变化,从-0.5π变化到1.5π;EndAngle从π变化到1.5π,最后StartAngle和EndAngle重合于1.5π;后半段中圆弧不断变长,最后直至消失。
二、实现代码
1、初始化一些全局属性
{ //刷新工具 CADisplayLink *_link; //显示圆环 CAShapeLayer *_animationLayer; //起始角度 CGFloat _startAngle; //结束角度 CGFloat _endAngle; //当前动画进度 CGFloat _progress;}2、界面刷新工作由CADisplayLink来完成
_link = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkAction)]; [_link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; _link.paused = true;为了实现前半段和后半段的速度区别,定义了一个速度方法:
-(CGFloat)speed{ if (_endAngle > M_PI) { return 0.1/60.0f; } return 0.8/60.0f;}通过CADisplayLink刷新进度,进度增长的快慢有speed决定:
-(void)displayLinkAction{ _progress += [self speed]; if (_progress >= 1) { _progress = 0; } [self updateAnimationLayer];}刷新贝塞尔曲线的StartAngle和EndAngle实现曲线的运动:
-(void)updateAnimationLayer{ _startAngle = -M_PI_2; _endAngle = -M_PI_2 +_progress * M_PI * 2; if (_endAngle > M_PI) { CGFloat progress1 = 1 - (1 - _progress)/0.25; _startAngle = -M_PI_2 + progress1 * M_PI * 2; } CGFloat radius = _animationLayer.bounds.size.width/2.0f - lineWidth/2.0f; CGFloat centerX = _animationLayer.bounds.size.width/2.0f; CGFloat centerY = _animationLayer.bounds.size.height/2.0f; UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(centerX, centerY) radius:radius startAngle:_startAngle endAngle:_endAngle clockwise:true]; path.lineCapStyle = kCGLineCapRound; _animationLayer.path = path.CGPath;}支付完成动画解析
为了方便观察,放慢了动画的速度,并添加辅助线:
原理分析
通过上图可知,支付完成的动画由两部分组成:圆环动画 + 对号动画
三、代码实现
1、圆环动画
这个动画比较简单,是利用贝塞尔曲线画弧的功能。再利用CAShapeLayer的strokeEnd属性加上核心动画实现的圆环动画。
-(void)circleAnimation{ //显示图层 CAShapeLayer *circleLayer = [CAShapeLayer layer]; circleLayer.frame = _animationLayer.bounds; [_animationLayer addSublayer:circleLayer]; circleLayer.fillColor = [[UIColor clearColor] CGColor]; circleLayer.strokeColor = BlueColor.CGColor; circleLayer.lineWidth = lineWidth; circleLayer.lineCap = kCALineCapRound; //运动路径 CGFloat lineWidth = 5.0f; CGFloat radius = _animationLayer.bounds.size.width/2.0f - lineWidth/2.0f; UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:circleLayer.position radius:radius startAngle:-M_PI/2 endAngle:M_PI*3/2 clockwise:true]; circleLayer.path = path.CGPath; //执行动画 CABasicAnimation *checkAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; checkAnimation.duration = circleDuriation; checkAnimation.fromValue = @(0.0f); checkAnimation.toValue = @(1.0f); checkAnimation.delegate = self; [checkAnimation setValue:@"checkAnimation" forKey:@"animationName"]; [circleLayer addAnimation:checkAnimation forKey:nil];}2、对号动画
对号动画是利用了贝塞尔曲线的画线特性,设置了两段曲线拼接成了一个对号。如上图所示对号由线段AB和线段BC拼接完成,然后再利用核心动画和CAShapeLayer的strokeEnd属性实现对号动画。
-(void)checkAnimation{ //外切圆的边长 CGFloat a = _animationLayer.bounds.size.width; //设置三个点 A、B、C UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(a*2.7/10,a*5.4/10)]; [path addLineToPoint:CGPointMake(a*4.5/10,a*7/10)]; [path addLineToPoint:CGPointMake(a*7.8/10,a*3.8/10)]; //显示图层 CAShapeLayer *checkLayer = [CAShapeLayer layer]; checkLayer.path = path.CGPath; checkLayer.fillColor = [UIColor clearColor].CGColor; checkLayer.strokeColor = BlueColor.CGColor; checkLayer.lineWidth = lineWidth; checkLayer.lineCap = kCALineCapRound; checkLayer.lineJoin = kCALineJoinRound; [_animationLayer addSublayer:checkLayer]; //执行动画 CABasicAnimation *checkAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; checkAnimation.duration = checkDuration; checkAnimation.fromValue = @(0.0f); checkAnimation.toValue = @(1.0f); checkAnimation.delegate = self; [checkAnimation setValue:@"checkAnimation" forKey:@"animationName"]; [checkLayer addAnimation:checkAnimation forKey:nil];}源码下载:
Github地址
本地下载
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
近几年的几部动画电影,比如大鱼海棠和哪吒之魔童降世。还有古风的动画片侠岚,不良人都证明中国的动画产业发展的越来越好。支付宝比较好,支付宝比较容易操作安全。很多人
支付宝AR扫描效果动画实现,具体内容如下之前一个网友说想要一个支付宝扫描动画的效果demo,所以又花了点时间做了下这个东西,先看效果图说一下实现的思路,如图中最
目前信用贷款的信用卡的信用记录是全国都可以查出来,而支付宝的信用贷款的信用记录只存在于支付宝内。影视动画,主要是做三维的动画;动漫设计与制作专业,可能涉及一些二
ios中uiimageview方法实现简单动画查阅uiimageview文档时,发现uiimageview有一组关于动画的方法/参数,可以实现简单的动画。包括:
本文实例讲述了Android开发之动画实现方法。分享给大家供大家参考。具体分析如下:动画分为三种:逐帧动画、布局动画和控件动画控件动画实现通过重写Animati