近期對 FaceBook 的 POP 動畫引擎由黑轉(zhuǎn)粉??,做個簡單小結(jié)。
不足之處望補充!
POP 是由 Kimon Tsinteris 開發(fā),F(xiàn)aceBook 開源的充滿物理效應(yīng)的動畫引擎。之前誤以為POP是基于Core Animation二次封裝的動畫效果,實際上POP可以對任何物體的任何屬性進行動畫!
框架總覽:
POP 由 1. Animations;2. Engine;3. Utility;4. WebCore 四部分組成。如下圖:
Engine 通過 CADisplayLink,將 App 的重繪速度設(shè)定到和屏幕刷新頻率一致 60 FPS,使得POP 動畫極為流暢,打造出一個游戲級的動畫引擎。著名的 Cocos-2d 也應(yīng)用了這個重要的技術(shù)。
Utility 與 WebCore 提供了 POP 的各項復(fù)雜計算的基本支持(其中 WebCore 里包含了一些從 Apple 的開源的網(wǎng)頁渲染引擎里拿出的源文件)。
POP - Animations 類型
1.Spring Animation 彈性動畫
* Bounciness 反彈-影響動畫作用的參數(shù)的變化幅度
* Speed 速度
* Tension 拉力-影響回彈力度以及速度
* Friction 摩擦力-如果開啟,動畫會不斷重復(fù),幅度逐漸削弱,直到停止。
* Mass 質(zhì)量-細微的影響動畫的回彈力度以及速度
使用案例:
POPSpringAnimation *spring = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerScaleXY];
spring.toValue = [NSValue valueWithCGPoint:CGPointMake(2.0, 2.0)];
spring.springBounciness = 4.0;
spring.springSpeed = 12.0;
spring.completionBlock = ^(POPAnimation *spring, BOOL finished) {
if (finished) {NSLog(@"Animation finished!");}};
因此我們要使用 toValue 來告訴 POP 我們希望分別縮放幾倍,如果你不提供 fromValue,那么 POP 將默認從當前的大小為依據(jù)進行縮放。值得一提的是,toValue 這里的值要和動畫作用的屬性一樣的結(jié)構(gòu)。如果我們操作 bounds ,那么這里應(yīng)該是 [NSValue valueWithCGRect:CGRectMake(0.0, 0.0, 200.0,400.0)]。
completionBlock 提供了一個 Callback,動畫的執(zhí)行過程會不斷調(diào)用這個 block,finished 這個布爾變量可以用來做動畫完成與否的判斷。
最后我們使用 pop_addAnimation 來讓動畫開始生效,如果你想刪除動畫的話,那么你需要調(diào)用 pop_removeAllAnimations 。 與 iOS 自帶的動畫不同,如果你在動畫的執(zhí)行過程中刪除了物體的動畫,那么物體會停在動畫狀態(tài)的最后一個瞬間,而不是閃回開始前的狀態(tài)
2.Decay Animation 衰減動畫
Decay Animation 實現(xiàn)了一個衰減效果。主要由 veiocity 速率參數(shù)控制效果。和iOS 7 提供的UI Dynamic 類似。使用方法如下:
POPDecayAnimation *decay = [POPDecayAnimation animWithPropertyNamed:kPOPLayerPositionX];
decay.velocity = @(100.0);
decay.fromValue = @(25.0);
//decay.deceleration = 0.998;
decay.completionBlock = ^(POPAnimation *decay, BOOL finished) {
if (finished) {NSLog(@"Stop!");}};
物體從 X 坐標的點 25.0 開始按照速率 100點/s 做減速運動,
velocity 是負值,那么就會反向遞減。
deceleration (負加速度) 是一個你會很少用到的值,默認是就是我們地球的 0.998,如果你開發(fā)給火星人用,那么這個值你使用 0.376 會更合適。
3.Property Animation & Basic Animation
可以對任何物體的任何屬性進行動畫,Spring Animation 和 Decay Animation 都是繼承自這個類
使用案例:
POPBasicAnimation *basic = [POPBasicAnimation animation];
basic.duration = 10.0;
basic.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
POPAnimatableProperty * prop = [POPAnimatableProperty propertyWithName:@"count" initializer:^(POPMutableAnimatableProperty *prop) { prop.readBlock = ^(id obj, CGFloat values[]) {
values[0] = [[obj description] floatValue];};
prop.writeBlock = ^(id obj, const CGFloat values[]) {
[obj setText:[NSString stringWithFormat:@"%.2f",values[0]]];};
prop.threshold = 0.01;}];
basic.property = prop;
basic.fromValue = @(0.0);
basic.toValue = @(100.0);