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

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

POP按钮动画

效果如下

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

你的肉眼能看出哪里用得哪种动画么?实心圆的尺寸变化、和空心圆的绘制进度是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值实现。

java动效_Animations开源动效分析(一)POP按钮动画相关推荐

  1. 鼠标动效html,5种纯CSS3鼠标hover按钮动画效果

    这是一款鼠标hover按钮动画特效.该特效共有5种hover动画效果,它们在结构布局上使用flex来进行布局,并通过css transition来实现动画效果. 使用方法 HTML结构 该按钮特效使用 ...

  2. 前端必看!微信都在用的开源动效方案【PAG动效】

    1.PAG 是什么? 在 web 中实现一个动画, css animation 声明一下各个时间点的样式就好了, 写起来并不麻烦.但是当设计给的动画越来越复杂, 还原度要求越来越高的情况下, 单纯依赖 ...

  3. 网易互娱动效设计师 | VX动效学习如何入门?

    在上篇<游戏动效与美术特效的区别>文章中,学院君给大家介绍了VX是什么.今天又给大家带来一篇VX动效入门干货文章,主要从哪里学,怎么做,如何深入等三个方面,系统讲下VX动效学习如何入门. ...

  4. AE 动画直接变原生代码:Airbnb 发布开源动画库 Lottie

    原文 Airbnb 发布的 Lottie 是一个面向 iOS.Android 和 React Native 的开源动画库. 简单来说,就是可以直接利用 AE 导出的 JSON 动画文件,将其解析为原生 ...

  5. 开源工具高效分析Java应用

    开源工具高效分析Java应用 不止一次,我们都萌发过想对运行中程序的底层状况一探究竟的念头.产生这种需求的原因可能是运行缓慢的服务.Java虚拟机(JVM)崩溃.挂起.死锁.频繁的JVM暂停.突然或持 ...

  6. android动画帧率_Android动画进阶—使用开源动画库nineoldandroids

    前言 Android系统支持原生动画,这为应用开发者开发绚丽的界面提供了极大的方便,有时候动画是很必要的,当你想做一个滑动的特效的时候,如果苦思冥想都搞不定,那么你可以考虑下动画,说不定动画轻易就搞定 ...

  7. Facebook开源动画库 POP-POPBasicAnimation运用

    动画在APP开发过程中还是经常出现,将花几天的时间对Facebook开源动画库 POP进行简单的学习:本文主要针对的是POPBasicAnimation运用:实例源代码已经上传至gitHub,地址:h ...

  8. Java三大主流开源工作流引擎分析

    Java三大主流开源工作流引擎分析 首先,这个评论是我从网上,书中,搜索和整理出来的,也许有技术点上的错误点,也许理解没那么深入.但是我是秉着学习的态度加以评论,学习,希望对大家有用,进入正题! 三大 ...

  9. java基于ssm的卡通动漫网站

    本系统设计为卡通动漫网站系统管理,主要功能是前台展示网站新闻信息,具有分类展示功能及在线留言和对文章的在线评论等功能,网站用户的注册,系统简介等.管理员后台的管理,管理员登录后台后可对现有管理员进行增 ...

最新文章

  1. idea 查看一个类的子类_Java-05-多态、抽象类、接口和内部类
  2. 弄懂webpack,只要看这一片就够了(文末有福利)
  3. 【渝粤题库】国家开放大学2021春2302供应链管理题目
  4. ES6必知必会 (七)—— Generator 函数
  5. WPF快速指导2:模板
  6. TJUSCSST第三次作业
  7. [雪峰磁针石博客]软件测试专家工具包2性能测试
  8. struts2中,在使用 convention 插件的情况下,如何使用 “chain” 这个resu
  9. Java基础面试题整理
  10. c语言砝码问题,C语言砝码称重问题
  11. html网上日记本设计,个人博客的设计_网上日记本的开发ASP334
  12. PTA新浪微博热门话题c++版——山东科技大学
  13. 正则表达式前端js,银行卡号/身份证/姓名号脱敏
  14. 探索分布式服务框架Dubbo开篇:牛逼哄哄的RPC
  15. 关于买鸡的问题,5文钱可以买一只公鸡,3文钱可以买一只母鸡,1文钱可以买3只雏鸡.现在用100文钱买100只鸡,那么各有公鸡、母鸡、雏鸡多少只?
  16. ElasticSearch索引生命周期管理(ILM)
  17. POJ 1753 Flip Game(递归枚举)
  18. 进度条媒体对象和Well组件
  19. 台式计算机用u盘给电脑安装系统,台式机用u盘装系统 电脑店给台式机装系统详细教程...
  20. Python爬虫的源码

热门文章

  1. 中国书法的价值和意义
  2. win7计算机 管理缺失文件夹,win7文件夹选项不见了怎么办_win7没有文件夹选项的处理方法...
  3. 阿德莱德大学计算机科学学士排名,2020年阿德莱德大学计算机科学学士就业前景,入学要求介绍...
  4. 手把手教你如何使用Multisim对Digilent FPGA开发板进行编程
  5. 剑指offter-面试题7.用两个栈实现队列
  6. 老用户专享福利——邀请好友最高可得云服务器3.5折续费折扣
  7. UE4如何使用Left Shift+W增加移动速度
  8. [OS-Linux]详解Linux的文件系统、inode和动静态库
  9. 国产操作系统逐步强大,Linux操作系统成为主流
  10. 网络基础之VLAN和端口类型(access、trunk和hybrid)