美文网首页
POP简单介绍

POP简单介绍

作者: 木马不在转 | 来源:发表于2017-12-19 14:39 被阅读25次
pop.gif

POP -来自于Facebook的动画引擎,现在很多APP已经在用它实现交互动画了,POP是个相当成熟且久经考验的框架,Facebook出品的令人惊叹的Paper应用中的所有动画和效果即出自POP。

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

一:POPBasicAnimation

简介
  1. POPBasicAnimation使用最广泛 提供固定时间间隔的动画(如淡入淡出效果)
  2. 添加一个动画最少仅需三步
    (1). 定义一个animation对象,并指定对应的动画属性
    (2). 设置初始值和默认值(初始值可以不指定,会默认从当前值开始)
    (3). 添加到想产生动画的对象上
    3.POPBasicAnimation可配置的属性与默认值为 duration:0.4 //动画间隔
    4.POPBasicAnimation提供四种timingfunction(很熟悉,对不对? 就是Core Animation中那些)
    • kCAMediaTimingFunctionLinear//线性增加
    • kCAMediaTimingFunctionEaseIn//先慢后线性增加
    • kCAMediaTimingFunctionEaseOut//先线性后慢增加
    • kCAMediaTimingFunctionEaseInEaseOut//先慢后线性在慢增加
代码示例
POPBasicAnimation *anBasic = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerPositionX];
anBasic.toValue = @(self.square.center.y+300);
anBasic.beginTime = CACurrentMediaTime() + 1.0f;
[self.square pop_addAnimation:anBasic forKey:@"position"];
动画效果如下:
POPBasicAnimation

二:POPSpringAnimation

简介

POPSpringAnimation也许是大多数人使用POP的理由,其提供一个类似弹簧一般的动画效果,POPSpringAnimation可配置的属性与默认值为

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

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

代码示例
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

三:POPDecayAnimation

简介

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

POPDecayAnimation可配置的属性与默认值为deceleration:0.998 //衰减系数(越小则衰减得越快)

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

代码示例
POPDecayAnimation *anDecay = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX];
anDecay.velocity = @(600);
anDecay.beginTime = CACurrentMediaTime() + 1.0f;
[self.square pop_addAnimation:anDecay forKey:@"position"];
动画效果如下:
POPDecayAnimation

四:POPCustomAnimation

简介

用来创建自定义动画和过渡效果,POPCustomAnimation并不是基于POPPropertyAnimation的,它直接继承自PopAnimation用于创建自定义动画用的,通过POPCustomAnimationBlock类型的block进行初始化,

typedef BOOL (^POPCustomAnimationBlock)(id target, POPCustomAnimation *animation); 
代码示例
//自定义
- (IBAction)Custom:(id)sender {
    
    //block返回值为yes代表动画一直执行(block会继续执行),返回值no代表动画结束(block不会继续被执行)。
//    POPCustomAnimation *cus = [POPCustomAnimation animationWithBlock:^BOOL(id target, POPCustomAnimation *animation) {
//        
//        //修改alpha值
//        CGFloat alpha = [target alpha];
//        alpha -= 0.005;
//        [target setAlpha:alpha];
//        
//        //每次向右移动1
//        CGRect frame = [target frame];
//        frame.origin.x += 1;
//        [target setFrame:frame];
//        //如果x坐标大于等于200,则结束动画,否则继续动画
//        if (frame.origin.x >= 200) {
//            return NO;
//        }
//        return YES;
//    }];
//    [sender pop_addAnimation:cus forKey:@"custom"];
 }

动画属性POPAnimatableProperty

基本介绍

动画属性由POPAnimatableProperty类管理,用来指定在哪个属性上应用动画效果.在下面的例子中,我们创建了一个弹性动画,并且显示设置动画属性为与-[CALayer bounds]对应的属性:

POPSpringAnimation *anim = [POPSpringAnimation animation];
anim.property = [POPAnimatableProperty propertyWithName:kPOPLayerBounds];

这个框架爱预先实现了了许多图层和视图共用的动画属性,你可以在自己的项目中直接使用.你也可以通过创建POPAnimatableProperty类的实例,来创建一个自定义的动画属性.下面的例子中,我们定义了一个自定义的volume动画属性:

prop = [POPAnimatableProperty propertyWithName:@"com.foo.radio.volume" initializer:^(POPMutableAnimatableProperty *prop) {
  // 读取动画属性的值
  prop.readBlock = ^(id obj, CGFloat values[]) {
    values[0] = [obj volume];
  };
  // 设置动画属性的值.
  prop.writeBlock = ^(id obj, const CGFloat values[]) {
    [obj setVolume:values[0]];
  };
  // 力学上的临界值
  prop.threshold = 0.01;
}];

anim.property = prop;

系统预定义的动画属性也是由上面例子的机制定义的,自定义动画属性时,很有借鉴价值.完整的预定义的动画属性列表和他们实现的具体细节参见POPAnimatableProperty.h:

/**
 图层(CALayer)通用动画属性.
 */
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;

/**
 图形层(CAShapeLayer)通用动画属性.
  */
extern NSString * const kPOPShapeLayerStrokeStart;
extern NSString * const kPOPShapeLayerStrokeEnd;
extern NSString * const kPOPShapeLayerStrokeColor;
extern NSString * const kPOPShapeLayerFillColor;

/**
 视图约束(NSLayoutConstraint)通用动画属性.
  */
extern NSString * const kPOPLayoutConstraintConstant;

/**
 视图(UIView)通用动画属性.
 */
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;

/**
 滚动视图(UIScrollView)通用动画属性.
 */
extern NSString * const kPOPScrollViewContentOffset;
extern NSString * const kPOPScrollViewContentSize;
extern NSString * const kPOPScrollViewZoomScale;
extern NSString * const kPOPScrollViewContentInset;

/**
 列表(UITableView)通用动画属性.
 */
extern NSString * const kPOPTableViewContentOffset;
extern NSString * const kPOPTableViewContentSize;

/**
 集合视图(UICollectionView)通用动画属性.
 */
extern NSString * const kPOPCollectionViewContentOffset;
extern NSString * const kPOPCollectionViewContentSize;

/**
 导航栏(UINavigationBar)通用动画属性.
 */
extern NSString * const kPOPNavigationBarBarTintColor;

/**
 工具栏(UIToolBar)通用动画属性.
 */
extern NSString * const kPOPToolbarBarTintColor;

/**
 标签栏(UITabBar)通用动画属性.
 */
extern NSString * const kPOPTabBarBarTintColor;

/**
 标签(UILabel)通用动画属性.
 */
extern NSString * const kPOPLabelTextColor;
自定义属性

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

代码示例

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

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

  • readBlock告诉POP当前的属性值
  • writeBlock中修改变化后的属性值
  • threashold决定了动画变化间隔的阈值,值越大writeBlock的调用次数越少

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

秒表实例
 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简单介绍

      本文链接:https://www.haomeiwen.com/subject/nvbbwxtx.html