资讯专栏INFORMATION COLUMN

Animations开源动效分析(一)POP按钮动画

cgh1999520 / 952人阅读

摘要:最近有一个上很火的开源动画集叫。建议配合源码学习。按钮动画没用过的的请移步使用指南效果如下思路整体效果是用三个和一个组合实现的。实心圆的颜色改变用的是弹簧动画。

最近Github有一个上很火的开源动画集叫Animations。

我也很喜欢做动画动效,特来学习观摩。因为动效的特殊性,很多情况下这个项目里的动效不能直接Copy到我们现有的项目中直接使用,所以搞清楚她们的实现原理就很有必要了。建议配合源码学习。

POP按钮动画

没用过的POP的请移步Facebook Pop 使用指南

效果如下

思路 整体效果是用三个CAShapeLayer和一个UILabel组合实现的。CAShapeLayer负责绘制两个圆的边和一个实心圆。动画用POP的POPBasicAnimationPOPSpringAnimation

你的肉眼能看出哪里用得哪种动画么?实心圆的尺寸变化、和空心圆的绘制进度是POPBasicAnimation实现的,基本是一个线性动画,匀速。实心圆的颜色改变用的是POPSpringAnimation弹簧动画。

关于CAShapeLayer

CAShapeLayer是一中特殊的CALayer用于绘制图形,可以理解成是CoreGraphic的一种对象化封装。一个CAShapeLayer可以绘制一个简单图形。例如例子里的圆

    UIBezierPath *path  = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.lineWidth + self.radius, self.lineWidth + self.radius)
                                                         radius:self.radius + self.lineWidth / 2.f
                                                     startAngle:self.startAngle
                                                       endAngle:self.endAngle
                                                      clockwise:self.clockWise];
    
    shapeLayer.path = path.CGPath;

bezierPathWithArcCenter这个方法中传入一系列参数,绘制了一条贝塞尔(bezier)曲线,参数分别是中心点、半径、开始角度、终止角度,是否闭环。

POP文字动画

POP实现的文字动画,例子里用的同样是POPBasicAnimation,所以也是线性变化的。

- (void)pop_animationDidApply:(POPAnimation *)anim {

    NSLog(@"pop_animationDidApply %@", anim);
    
    NSValue *toValue = (NSValue *)[anim valueForKeyPath:@"currentValue"];
    CGSize size      = [toValue CGSizeValue];
    
    [CATransaction setDisableActions:YES];
    CGFloat percent         = (size.height - _math.b) / _math.k;
    _circleShape1.strokeEnd = percent;
    _circleShape2.strokeEnd = percent;
    [CATransaction setDisableActions:NO];
    
    UIColor *color       = [UIColor colorWithRed:percent green:percent blue:percent alpha:1.f];
    double showValue     = fabs(percent * 100);
    self.label.text      = [NSString stringWithFormat:@"%.f%%", showValue];
    self.label.textColor = color;
    
    _blurImageView.alpha = 1 - percent;
}

解释,这个POP动画的分帧回调,回调中用

   NSValue *toValue = (NSValue *)[anim valueForKeyPath:@"currentValue"];

取得当前动画的值,这个动画实际只是改变了实心圆的尺寸。然后开发者通过当前尺寸计算出动画的进度

   CGFloat percent         = (size.height - _math.b) / _math.k;

CATransaction动画开关,禁用了两个外边圆的strokeEnd 隐式动画。

 [CATransaction setDisableActions:YES]; 

如果你不明白CALayer的显式动画和隐式动画的区别,请仿照CALayer的隐式动画和显式动画写一个Demo对比一下。有更多问题可以在下面留言。

响应链

Target模式,很容易理解。

   // 按住按钮后没有松手的动画
    [_button addTarget:self action:@selector(scaleToSmall) forControlEvents:UIControlEventTouchDown | UIControlEventTouchDragEnter];
    
    // 按住按钮松手后的动画
    [_button addTarget:self action:@selector(scaleAnimations) forControlEvents:UIControlEventTouchUpInside];
    
    // 按住按钮后拖拽出去的动画
    [_button addTarget:self action:@selector(scaleToDefault) forControlEvents:UIControlEventTouchDragExit];
高斯模糊

高斯模糊(blur)的实现有很多方式,这个源码里使用的UIImage+ImageEffects是一个 UIImage的扩展。

动画效果通过用blur层覆盖在普通层上,通过修改blur层alpha值实现。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16011.html

相关文章

  • Animations开源动效分析(二)POP-Stroke动画

    摘要:是线性的动画,一条直线。也借用了类实现非线性动画。开始,系统大量引入了非线性动画。两者有一点区别,参考源码中的和动画参数详解动画今天我们来分析一下动画的源代码,首先中声明了一个是中心的圆,是一个定时器。所以总共使用了三个动画。 本教程源码Animations 作者 YouXianMing,建议配合源码项目食用 Facebook pop动画框架简易教程请移步 Facebook Pop ...

    ccj659 评论0 收藏0
  • 可能是最全的前端动效库汇总

    摘要:非常的庞大,而且它是完全为设计而生的动效库。它运行于纯粹的之上,是目前最强健的动画资源库之一。可能是创建滚动特效最好用的工具,它支持大量的浏览器,只要它们支持和特性。可以通过安装吊炸天了,接近现实生活中的物理运动碰撞惯性动画库。 收集日期为2019-02-28,★代表当时的该项目在github的star数量 Animate.css 56401 ★ 一个跨浏览器的动效基础库,是许多基础动...

    afishhhhh 评论0 收藏0
  • Week4 优质文章整理

    摘要:错过了一周的优质内容,不要再错过周一的快速回顾一周深度揭秘启动全过程翻译组每周社区问答入门语言简明入门与提高一只爬虫崔小拽爬虫知乎用户数据爬取和分析如何学习开源动效分析二动画最佳实践一工具箱之生命周期工具箱之权限管理一步步创建自己的框 错过了一周的优质内容,不要再错过周一的快速回顾 一周 fir.im Weekly -《深度揭秘 App 启动全过程》 SwiftGG翻译组 -《每周 S...

    hiYoHoo 评论0 收藏0
  • Week4 优质文章整理

    摘要:错过了一周的优质内容,不要再错过周一的快速回顾一周深度揭秘启动全过程翻译组每周社区问答入门语言简明入门与提高一只爬虫崔小拽爬虫知乎用户数据爬取和分析如何学习开源动效分析二动画最佳实践一工具箱之生命周期工具箱之权限管理一步步创建自己的框 错过了一周的优质内容,不要再错过周一的快速回顾 一周 fir.im Weekly -《深度揭秘 App 启动全过程》 SwiftGG翻译组 -《每周 S...

    call_me_R 评论0 收藏0
  • Week4 优质文章整理

    摘要:错过了一周的优质内容,不要再错过周一的快速回顾一周深度揭秘启动全过程翻译组每周社区问答入门语言简明入门与提高一只爬虫崔小拽爬虫知乎用户数据爬取和分析如何学习开源动效分析二动画最佳实践一工具箱之生命周期工具箱之权限管理一步步创建自己的框 错过了一周的优质内容,不要再错过周一的快速回顾 一周 fir.im Weekly -《深度揭秘 App 启动全过程》 SwiftGG翻译组 -《每周 S...

    Cympros 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<