POP 动画-牛刀小试

在iOS开发中,动画可以说是美化App,提高App的交互效果的利器。So,POP是FaceBook开源的一款动画的第三方。近日稍微看了一下,介绍一下简单的入门级内容。

POP-进入你的项目

使用CocoaPod就十分简单了。

pod 'pop', '~> 1.0'

POP-使用

POP有默认的三种动画,和支持自定义动画。

  • POPBasicAnimation 基础动画
  • POPSpringAnimation 弹性动画
  • POPDecayAnimation 阻尼动画
  • POPCustomAnimation 自定义动画

下面我们通过一步步的讲解,一步步的学习POP

POPBasicAnimation

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

入门级效果的解析,效果如下:

BaseAnimation
    POPBasicAnimation *anBasic = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerPositionX];
    anBasic.fromValue = @(0);
    anBasic.toValue = @(view.frame.origin.x + 200);
    anBasic.beginTime = CACurrentMediaTime() + 1.0f;
    anBasic.duration = 0.4f;
    anBasic.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    [view.layer pop_addAnimation:anBasic forKey:@"position"];

熟悉POP的中有几个概念。

PropertyNamed ---> kPOPLayerPositionX 表示这个动画负责监听或者说动态变化的值

fromValue 表示这个动画监听值的起始值

toValue 表示这个动画监听值的结束值

beginTime 表示动画的起始时间,+1.0f表示向后延时 1s

duration 表示动画的持续时间

timingFunction 表示动画的效果淡入淡出等

timingFunction 包括

  • kCAMediaTimingFunctionLinear --- 线性动画
  • kCAMediaTimingFunctionEaseIn --- 淡入
  • kCAMediaTimingFunctionEaseOut --- 淡出
  • kCAMediaTimingFunctionEaseInEaseOut --- 先淡入再淡出

了解了上面的东西基本上就能看懂那段代码了。

大体意思就是我,我定义了一个监听LayerX值的动画。然后设置一下X的起始位置,结束位置,开始时间,持续时间,动画效果。然后我这个动画基本就定义好了。

接下来,我吧这个动画添加到View的Layer上。并给他一个Key(随意)。

经过这个,你大体能够理解POP该怎么写动画效果了。简单方便,实用经济。

POPSpringAnimation

弹性动画,是很多人选择POP的原因了吧。因为他有一些像弹簧一样的效果。

先上效果:

SpringAnimation
    POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPositionX];
    anim.toValue = @(view.frame.origin.x + 200);
    anim.beginTime = CACurrentMediaTime() + 1.0f;
    anim.springBounciness = 15.0f;
    [view.layer pop_addAnimation:anim forKey:@"position"];

说一些SpringAnimation特有的属性吧。

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

POPDecayAnimation

阻尼动画,顾名思义,动画就像公交慢慢踩刹车一样,慢慢减速的动画。

    POPDecayAnimation *anDecay = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX];
    anDecay.velocity = @(view.frame.origin.x + 200);
    anDecay.beginTime = CACurrentMediaTime();
    anDecay.deceleration = 0.998;
    [view.layer pop_addAnimation:anDecay forKey:@"position"];

效果自己可以试试,这里有一个注意点。toValue,Duration设置将没有什么意义。这个时候的运动值是根据 velocity,deceleration计算出来的。

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

POPAnimatablePropery

这个Propery就是监听的属性值。

下面提供一个监听属性表

/**
 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;

具体每一个属性监听的代码设置可以参考Git上面的例子。

POP Git Link

自定义POPAnimatableProperty

有些时候既有的Property可能满足不了我们的需求,这个时候我们可以自定义Property。

通过一个例子我们来讲解一下。先上效果:

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

这个时候,有些东西可以特殊解释一下。

prop.writeBlock 这个是Animation中Value每次的变化都会调用这个回调,然后就可以在这个Block里面做一些事情,效果。

values数组表示的是什么呢。在这个中Value是一个数值,就是Values[0].

然后如果Value是一个CGRect,那么values[0],values[1],values[2],values[3] 就分别对应 CGRectMake(0, 0, 20.0, 20.0)0, 0, 20.0, 20.0

总结

POP动画基础入门就是这样,想要深入可以看Git的官方文档。

POP的文档还是十分完备的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,478评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,462评论 6 30
  • 近几年突然迷上了旅游,或许是工作的压力,或许是婚姻的不满意,无处可逃便只有暂时的出走。 这次随旅行社的专列跑了一遍...
    墨竹居士阅读 447评论 0 2
  • 有一点意想的就要跟上去。不拒绝我三次不放弃!
    宬宬阅读 164评论 0 0