http://www.cocoachina.com/ios/20150728/12734.html

作者:里脊串 授权本站转载。

前言

动画在APP开发过程中,大家多多少少都会接触到,而且随着iOS7的扁平化风格启用之后,越来越多的APP开始尝试加入各种绚丽的动画交互效果以增加APP的用户体验。(当然,还是以国外的APP居多)

有过相关开发经验的同学肯定知道在iOS中,动画相关的部分都是基于Core Animation,但是今天我们不讨论Core Animation。今天的主角是POP -来自于Facebook的动画引擎(其实我不喜欢把POP定义为动画引擎 我愿意称它为函数发生器)

介绍

官方地址 https://github.com/facebook/pop

官方介绍(翻译版)

POP是一个在iOS与OS X上通用的极具扩展性的动画引擎。它在基本的静态动画的基础上增加的弹簧动画与衰减动画,使之能创造出更真实更具物理性的交互动画。POP的API可以快速的与现有的ObjC代码集成并可以作用于任意对象的任意属性。

POP是个相当成熟且久经考验的框架,Facebook出品的令人惊叹的Paper应用中的所有动画和效果即出自POP。

安装方式还是推荐使用CocoaPod。

pod 'pop', '~> 1.0'

POP的神奇之处在于,它是独立与Core Animation的存在。所以,忘记Core Animation吧,忘记Layer Tree吧,迎接一个简单的明天!(LOL 开玩笑的~:) 很多地方还是会需要Core Animation的,不过说不定哪天苹果大发善心,将动画相关的部分向POP借鉴一点也不是不可能的(比如SpriteKit就借鉴了Cocos2D :)

使用

POP默认支持三种动画,但同时也支持自定义动画。

  • POPBasicAnimation

  • POPSpringAnimation

  • POPDecayAnimation

  • POPCustomAnimation //自定义动画

这里我们只讨论前三种(因为自定义动画我也没用过 :) 先来看看官方的示例代码吧。

官方代码示例

//Basic animations can be used to interpolate values over a specified time period. To use an ease-in ease-out animation to animate a view's alpha from 0.0 to 1.0 over the default duration:
POPBasicAnimation *anim = [POPBasicAnimation animationWithPropertyNamed:kPOPViewAlpha];
anim.fromValue = @(0.0);
anim.toValue = @(1.0);
[view pop_addAnimation:anim forKey:@"fade"];
//Spring animations can be used to give objects a delightful bounce. In this example, we use a spring animation to animate a layer's bounds from its current value to (0, 0, 400, 400):
POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds];
anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 400, 400)];
[layer pop_addAnimation:anim forKey:@"size"];
//Decay animations can be used to gradually slow an object to a halt. In this example, we decay a layer's positionX from it's current value and velocity 1000pts per second:
POPDecayAnimation *anim = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX];
anim.velocity = @(1000.);
[layer pop_addAnimation:anim forKey:@"slide"];

POPBasicAnimation

POPBasicAnimation使用最广泛 提供固定时间间隔的动画(如淡入淡出效果)

代码示例1

POPBasicAnimation *anBasic = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerPositionX];
anBasic.toValue = @(self.square.center.y+300);
anBasic.beginTime = CACurrentMediaTime() + 1.0f;
[self.square pop_addAnimation:anBasic forKey:@"position"];

其动画效果如下

可以看到,添加一个动画最少仅需三步

  1. 定义一个animation对象,并指定对应的动画属性

  2. 设置初始值和默认值(初始值可以不指定,会默认从当前值开始)

  3. 添加到想产生动画的对象上

POPBasicAnimation可配置的属性与默认值为

duration:0.4    //动画间隔

POPBasicAnimation提供四种timingfunction(很熟悉,对不对? 就是Core Animation中那些)

  • kCAMediaTimingFunctionLinear

  • kCAMediaTimingFunctionEaseIn

  • kCAMediaTimingFunctionEaseOut

  • kCAMediaTimingFunctionEaseInEaseOut

其时间函数分别如下

POPSpringAnimation

POPSpringAnimation也许是大多数人使用POP的理由,其提供一个类似弹簧一般的动画效果(使用后,APP立马就活泼起来了,有木有?!)

代码示例23

POPSpringAnimation *anSpring = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPositionX];
anSpring.toValue = @(self.square.center.y+300);
anSpring.beginTime = CACurrentMediaTime() + 1.0f;
anSpring.springBounciness = 10.0f;
[self.square pop_addAnimation:anSpring forKey:@"position"];

其动画效果如下

POPSpringAnimation可配置的属性与默认值为

springBounciness:4.0    //[0-20] 弹力 越大则震动幅度越大
springSpeed     :12.0   //[0-20] 速度 越大则动画结束越快
dynamicsTension :0      //拉力  接下来这三个都跟物理力学模拟相关 数值调整起来也很费时 没事不建议使用哈
dynamicsFriction:0      //摩擦 同上
dynamicsMass    :0      //质量 同上

注意:POPSpringAnimation是没有duration字段的,其动画持续时间由以上几个参数决定

其时间函数如下

POPDecayAnimation

POPDecayAnimation提供一个过阻尼效果(其实Spring是一种欠阻尼效果),可以实现类似UIScrollView的滑动衰减效果(是的 你可以靠它来自己实现一个UIScrollView)

代码示例3

POPDecayAnimation *anDecay = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX];
anDecay.velocity = @(600);
anDecay.beginTime = CACurrentMediaTime() + 1.0f;
[self.square pop_addAnimation:anDecay forKey:@"position"];

其动画效果如下

注意:这里对POPDecayAnimation设置toValue是没有意义的,会被忽略(因为目的状态是动态计算得到的)

POPDecayAnimation可配置的属性与默认值为

deceleration:0.998  //衰减系数(越小则衰减得越快)

注意:POPDecayAnimation也是没有duration字段的,其动画持续时间由velocity与deceleration决定

其时间函数如下

接下来我们看一下POP默认支持哪些属性的动画。打开POPAnimatablePropery.h可以看到如下定义(这些是到目前为止 所支持的属性 随着版本的更新 还在不断的新增中 :)

/**Common CALayer property names.*/
extern NSString * const kPOPLayerBackgroundColor;
extern NSString * const kPOPLayerBounds;
extern NSString * const kPOPLayerCornerRadius;
extern NSString * const kPOPLayerBorderWidth;
extern NSString * const kPOPLayerBorderColor;
extern NSString * const kPOPLayerOpacity;
extern NSString * const kPOPLayerPosition;
extern NSString * const kPOPLayerPositionX;
extern NSString * const kPOPLayerPositionY;
extern NSString * const kPOPLayerRotation;
extern NSString * const kPOPLayerRotationX;
extern NSString * const kPOPLayerRotationY;
extern NSString * const kPOPLayerScaleX;
extern NSString * const kPOPLayerScaleXY;
extern NSString * const kPOPLayerScaleY;
extern NSString * const kPOPLayerSize;
extern NSString * const kPOPLayerSubscaleXY;
extern NSString * const kPOPLayerSubtranslationX;
extern NSString * const kPOPLayerSubtranslationXY;
extern NSString * const kPOPLayerSubtranslationY;
extern NSString * const kPOPLayerSubtranslationZ;
extern NSString * const kPOPLayerTranslationX;
extern NSString * const kPOPLayerTranslationXY;
extern NSString * const kPOPLayerTranslationY;
extern NSString * const kPOPLayerTranslationZ;
extern NSString * const kPOPLayerZPosition;
extern NSString * const kPOPLayerShadowColor;
extern NSString * const kPOPLayerShadowOffset;
extern NSString * const kPOPLayerShadowOpacity;
extern NSString * const kPOPLayerShadowRadius;
/**Common CAShapeLayer property names.*/
extern NSString * const kPOPShapeLayerStrokeStart;
extern NSString * const kPOPShapeLayerStrokeEnd;
extern NSString * const kPOPShapeLayerStrokeColor;
extern NSString * const kPOPShapeLayerFillColor;
/**Common NSLayoutConstraint property names.*/
extern NSString * const kPOPLayoutConstraintConstant;
#if TARGET_OS_IPHONE
/**Common UIView property names.*/
extern NSString * const kPOPViewAlpha;
extern NSString * const kPOPViewBackgroundColor;
extern NSString * const kPOPViewBounds;
extern NSString * const kPOPViewCenter;
extern NSString * const kPOPViewFrame;
extern NSString * const kPOPViewScaleX;
extern NSString * const kPOPViewScaleXY;
extern NSString * const kPOPViewScaleY;
extern NSString * const kPOPViewSize;
extern NSString * const kPOPViewTintColor;
/**Common UIScrollView property names.*/
extern NSString * const kPOPScrollViewContentOffset;
extern NSString * const kPOPScrollViewContentSize;
extern NSString * const kPOPScrollViewZoomScale;
extern NSString * const kPOPScrollViewContentInset;
/**Common UITableView property names.*/
extern NSString * const kPOPTableViewContentOffset;
extern NSString * const kPOPTableViewContentSize;
/**Common UICollectionView property names.*/
extern NSString * const kPOPCollectionViewContentOffset;
extern NSString * const kPOPCollectionViewContentSize;
/**Common UINavigationBar property names.*/
extern NSString * const kPOPNavigationBarBarTintColor;
/**Common UIToolbar property names.*/
extern NSString * const kPOPToolbarBarTintColor;
/**Common UITabBar property names.*/
extern NSString * const kPOPTabBarBarTintColor;
/**Common UILabel property names.*/
extern NSString * const kPOPLabelTextColor;

作为刚接触POP的一些同学来说,如果在上面看到你希望的某些属性的话,你可以像官方代码示例一样指定这个属性即可开始动画了

但是如果你想要的某些属性不在之上呢,这时候自定义属性POPAnimatableProperty就排上用场了

自定义属性

POP默认支持的三种动画都继承自POPPropertyAnimation。POPPropertyAnimation中定义了一个叫property的属性( 之前没有用到它是因为POP根据不同的默认动画属性帮你生成了默认的property) 而这个property则是用来驱动POP的动画效果中的重要一环。

代码示例4

POPAnimatableProperty *prop = [POPAnimatableProperty propertyWithName:@"prop" initializer:^(POPMutableAnimatableProperty *prop) {// read valueprop.readBlock = ^(id obj, CGFloat values[]) {};// write valueprop.writeBlock = ^(id obj, const CGFloat values[]) {};// dynamics thresholdprop.threshold = 0.01;
}];

其组成就是一个readBlock一个writeBlock和一个threashold

  • readBlock告诉POP当前的属性值

  • writeBlock中修改变化后的属性值

  • threashold决定了动画变化间隔的阈值,值越大writeBlock的调用次数越少

POPAnimatableProperty其实是POP中一个比较重要的东西,像上面提到的POP自带的动画属性,查看源代码可以看到也只是POP自动帮你设置好了POPAnimatableProperty而已,其作用就是当动画的某个时间片被触发时,告诉系统如何根据当前时间片做出变化。

还是以一个实际的例子来说明如何使用自定义属性,比如我们要实现一个像系统的时钟APP里秒表计时的一个效果。

    POPAnimatableProperty *prop = [POPAnimatableProperty propertyWithName:@"countdown" initializer:^(POPMutableAnimatableProperty *prop) {prop.writeBlock = ^(id obj, const CGFloat values[]) {UILabel *lable = (UILabel*)obj;label.text = [NSString stringWithFormat:@"d:d:d",(int)values[0]/60,(int)values[0]%60,(int)(values[0]*100)0];};
//        prop.threshold = 0.01f;}];POPBasicAnimation *anBasic = [POPBasicAnimation linearAnimation];   //秒表当然必须是线性的时间函数anBasic.property = prop;    //自定义属性anBasic.fromValue = @(0);   //从0开始anBasic.toValue = @(3*60);  //180秒anBasic.duration = 3*60;    //持续3分钟anBasic.beginTime = CACurrentMediaTime() + 1.0f;    //延迟1秒开始[label pop_addAnimation:anBasic forKey:@"countdown"];

其动画效果如下

有没有从中得到一些启发呢? POP可以做的事情可远比Core Animation要多(注意这里我们使用了beginTime这个属性来设置动画的延迟施放) 例如音乐播放时那种淡入淡出的效果等等也可以用POP来实现

小结

其实只需要熟练掌握POP自带的三种动画,即可完成大部分的动画效果。如果实在是无法满足你的需求的话,自定义动画也基本可以满足你的要求。可以说POP化繁为简的出现,极大的方便了我们这些苦逼的coder。

当然,就像我说的,POP不仅仅是一个动画引擎。相信经过我最后一个例子,大家可以得到一点启示,POP能做的事情还不少 :)

转载于:https://www.cnblogs.com/itlover2013/p/4682790.html

POP介绍与使用实践(快速上手动画)相关推荐

  1. 转帖Masonry介绍与使用实践(快速上手Autolayout)

    前言 1 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时 ...

  2. iOS Masonry介绍与使用实践(快速上手Autolayout)

    前言 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时代 ...

  3. sap模块介绍_SAP系统如何快速上手?

    SAP系统如何快速上手? 这是笔者在今日头条上对于一个问题的答复,整理成此篇文字. 作为一个在SAP咨询业界打拼十多年的资深人士,我给你的建议是: 1,最好是有一个老师带着你一起学.如果你运气好,能进 ...

  4. 在Web 3D 游戏开发的前端如何快速上手进行

    本文以「余额宝3D跑酷游戏」为例,介绍了前端如何快速上手 Web 3D 游戏的开发.跑酷游戏是余额宝七周年的主玩法,用户通过做任务来获取玩游戏的机会并且解锁游戏道具,从而在游戏中获得更多的金币,最终可 ...

  5. 官方 React 快速上手脚手架 create-react-app

    此文简单讲解了官方 React 快速上手脚手架的安装与介绍. 1. React 快速上手脚手架 create-react-app 为了快速地进行构建使用 React 的项目,FaceBook 官方发布 ...

  6. 新手必看 | RVB2601开发板快速上手指南

    简介:技术解码栏目:是面向开发者详细解读芯片开放社区(OCC)上关于处理器.芯片.基础软件平台.集成开发环境及应用开发平台的相关技术,方便开发者学习及快速上手,提升开发效率. 之前我们推送了RISC- ...

  7. 前端如何快速上手 Web 3D 游戏的开发

    简介: 本文以「余额宝3D跑酷游戏」为例,介绍了前端如何快速上手 Web 3D 游戏的开发. 作者 | RichLab楺楺 诚空 本文以「余额宝3D跑酷游戏」为例,介绍了前端如何快速上手 Web 3D ...

  8. 快速上手Spring WebFlux框架

    一.前言 本文主要介绍基于SpringBoot如何快速上手使用SpringFlux框架开发WEB网站. Spring 5.0在原有的Spring MVC Stack(又称Servlet Stack)以 ...

  9. 自动交易程序介绍——普通个人和团队如何快速上手量化

    点击上方"蓝色字"可关注我们! 作者:Cybex&HashBang 上期提到我们提到,针对自己开发代码进行程序化.自动化的交易的个人或者团队,去中心化交易所能够提供更好的环 ...

  10. goland go test_Go单元测试实践一,快速上手

    Go单元测试实践二,常见问题 Go单元测试实践三,代码风格 Go 单元测试实践四,集成到gitlabci 前段时间我在团队内推广了单测,为帮助同事快速上手,写了一些文档,这是第一篇, 如果你对单测,G ...

最新文章

  1. 物联网安全Wi-Fi漫游
  2. ROC曲线是什么?ROC曲线是怎么绘制的?ROC曲线的横纵坐标是什么?如何用Python绘制?AUC又是什么?
  3. 90. Subsets II
  4. 软件的复用技术及开发方法
  5. 网易云信携手LiveVideoStackCon 2019,探索多媒体技术新世界
  6. VTK:IO之ReadLegacyUnstructuredGrid
  7. SQL Server on Ubuntu——Ubuntu上的SQL Server(全截图)
  8. 中信国健临床通讯2011年1月第1期目录
  9. 小米10首销战绩公布:嘴上说不买身体却很诚实
  10. 水力冲孔数值模拟前景_防喷器成形工艺的有限元数值模拟研究
  11. 如何在shell中执行 字符串拼接起来的命令 cmd = ls / 执行方法:$cmd
  12. 微软职位内部推荐-UX Designer II
  13. 《Spring揭秘》
  14. php生成拟合线,excel拟合曲线怎么做
  15. SparkSQL和HiveSql的对比
  16. python下雨动画特效_pygame实现烟雨蒙蒙下彩虹雨
  17. 【java毕业设计】基于java+SSH+JSP的固定资产管理系统设计与实现(毕业论文+程序源码)——固定资产管理系统
  18. php是什么电器元件,看完这个保证你认识“贴片电路板上”的每一个电子元件
  19. euv光刻机有什么用_EUV到底是什么东西?光刻机上为何频频提到EUV
  20. Win7电脑无法进入睡眠模式?

热门文章

  1. centos下安装和卸载jdk
  2. 201903版的idea markdown无法预览的问题
  3. 文件服务器php源码,php 在服务器上载文件
  4. java8 时间类型相关类
  5. 【渝粤教育】国家开放大学2018年秋季 0463-21T英语语音 参考试题
  6. 【渝粤教育】国家开放大学2018年秋季 1302T护理科研方法 参考试题
  7. 3D Object Detection入门——PointRCNN代码学习
  8. matlab中的小函数
  9. 【iCore4 双核心板_ARM】例程二十九:SD_IAP_FPGA实验——更新升级FPGA
  10. Web页面输出Excel的数字问题解决方法