POP -来自于Facebook的动画引擎,现在很多APP已经在用它实现交互动画了,POP是个相当成熟且久经考验的框架,Facebook出品的令人惊叹的Paper应用中的所有动画和效果即出自POP。
POP默认支持三种动画,但同时也支持自定义动画。
一:POPBasicAnimation
简介
-
POPBasicAnimation
使用最广泛 提供固定时间间隔的动画(如淡入淡出效果) - 添加一个动画最少仅需三步
(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
字段的,其动画持续时间由velocity
与deceleration
决定
代码示例
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默认支持的三种动画都继承自POPPropertyAnimation
。POPPropertyAnimation
中定义了一个叫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"];
其动画效果如下
秒表⏱
网友评论