最近一直在看關(guān)于CALayer的相關(guān)知識(shí)诞仓,這里整理一下CABasicAnimation相關(guān)知識(shí)
1.CAlayer
2.CoreAnimation
3.anchorPoint(錨點(diǎn))
4.CABasicAnimation
一售貌、關(guān)于CAlayer
CoreAnimation是基于CAlayer層的動(dòng)畫(huà)险领,CAlayer是定義在QuartzCore框架中的(Core Animation)
蘋(píng)果對(duì)于CAlayer的概述
CAlayer管理基于圖像的內(nèi)容并允許您對(duì)該內(nèi)容執(zhí)行動(dòng)畫(huà)的對(duì)象
層通常用于為視圖提供后備存儲(chǔ),但也可以使用业踏,而無(wú)需顯示內(nèi)容韵丑。層的主要工作是管理您提供的視覺(jué)內(nèi)容僻孝,但圖層本身具有可設(shè)置的可視屬性导帝,例如背景顏色,邊框和陰影穿铆。除了管理視覺(jué)內(nèi)容之外您单,該層還保留有關(guān)其內(nèi)容的幾何形狀的信息(例如其位置,大小和變換)荞雏,用于在屏幕上呈現(xiàn)該內(nèi)容虐秦。
修改圖層的屬性是如何啟動(dòng)圖層內(nèi)容或幾何圖形的動(dòng)畫(huà)。層對(duì)象通過(guò)采用定義層的定時(shí)信息的協(xié)議來(lái)封裝層的持續(xù)時(shí)間和起始位置及其動(dòng)畫(huà)凤优。CAMediaTiming
如果圖層對(duì)象是由視圖創(chuàng)建的悦陋,則視圖通常會(huì)自動(dòng)分配為圖層的委托,并且不應(yīng)更改該關(guān)系筑辨。對(duì)于您自己創(chuàng)建的圖層俺驶,可以分配delegate對(duì)象并使用該對(duì)象動(dòng)態(tài)提供圖層的內(nèi)容并執(zhí)行其他任務(wù)。圖層也可能具有布局管理器對(duì)象(分配給該屬性)以分別管理子視圖的布局棍辕。layoutManager
CAlayer遵循CAMeidaTiming協(xié)議,CABasicAnimation繼承于CAPropertyAnimation,CAPropertyAnimation繼承于CAAnimation而CAAnimation遵CAMeidaTiming協(xié)議
CAMediaTiming屬性列表
屬性 | 類型 | 說(shuō)明 |
---|---|---|
beginTime | CFTimeInterval | 指定接收方相對(duì)于其父對(duì)象(如果適用)的開(kāi)始時(shí)間暮现。 |
timeOffset | CFTimeInterval | 指定活動(dòng)本地時(shí)間的額外時(shí)間偏移量。 |
repeatCount | float | 確定動(dòng)畫(huà)重復(fù)的次數(shù)楚昭。 |
repeatDuration | CFTimeInterval | 確定動(dòng)畫(huà)重復(fù)的秒數(shù)栖袋。 |
duration | CFTimeInterval | 指定動(dòng)畫(huà)的基本持續(xù)時(shí)間,以秒為單位抚太。 |
speed | float | 指定從父時(shí)間空間將時(shí)間映射到接收者的時(shí)間空間塘幅。 |
autoreverses | BOOL | 確定動(dòng)畫(huà)在完成后是否相反執(zhí)行 |
fillMode | NSString | 確定接收者的演示文稿是否在其活動(dòng)持續(xù)時(shí)間完成后被凍結(jié)或刪除昔案。 |
FillMode
這些常數(shù)決定了定時(shí)對(duì)象在其活動(dòng)持續(xù)時(shí)間完成后的行為。默認(rèn)值是 kCAFillModeRemoved电媳。
二踏揣、CAAnimation
CAAnimation可以分為以下幾類:
- CABasicAnimation
基礎(chǔ)動(dòng)畫(huà),通過(guò)設(shè)定起始點(diǎn)匆背,終點(diǎn)呼伸,時(shí)間,動(dòng)畫(huà)會(huì)沿著你這設(shè)定點(diǎn)進(jìn)行移動(dòng)钝尸。可以看做特殊的CAKeyFrameAnimation - CAKeyframeAnimation
關(guān)鍵幀動(dòng)畫(huà)搂根,可定制度比CABasicAnimation高珍促,也是本系列的接下來(lái)的內(nèi)容 - CAAnimationGroup
組動(dòng)畫(huà),支持多個(gè)CABasicAnimation或者CAKeyframeAnimation動(dòng)畫(huà)同時(shí)執(zhí)行
- CAAnimation 是一個(gè)抽象類剩愧, 遵循了CAMediaTiming協(xié)議和CAAction協(xié)議 我們不能直接使用CAAnimation類 而是使用其子類猪叙;
- CATransition:提供漸變效果,比如推拉push效果仁卷,消退fade效果穴翩,揭開(kāi)reveal 效果
- CAAnimationGroup 允許多個(gè)動(dòng)畫(huà)同時(shí)播放
- CABasicAnimation 提供了對(duì)單一動(dòng)畫(huà)的實(shí)現(xiàn)
- CAKeyframeAnimation 關(guān)鍵幀動(dòng)畫(huà) 可以定義動(dòng)畫(huà)路線
- CAPropertyAnimation 屬性動(dòng)畫(huà) 通常不直接使用,而是使用CABasicAnimation子類
** CABasicAnimation屬性及說(shuō)明**
CABasicAnimation提供了最基礎(chǔ)的動(dòng)畫(huà)屬性設(shè)置锦积,是簡(jiǎn)單的keyframe動(dòng)畫(huà)性能芒帕。CABasicAnimation可以看做是一種CAKeyframeAnimation的簡(jiǎn)單動(dòng)畫(huà),因?yàn)樗挥蓄^尾的關(guān)鍵幀(keyframe)丰介。
我們可以創(chuàng)建一個(gè)CABasicAnimaiton的對(duì)象通過(guò)keyPath的方式背蟆。CABasicAnimation提供了fromValue、toValue哮幢、byValue的設(shè)置(插值)带膀。它們?nèi)齻€(gè)屬性定義了一個(gè)動(dòng)畫(huà)的軌跡,并且最少兩個(gè)值不能為空橙垢。
當(dāng)設(shè)置了CABasicAnimation的起點(diǎn)與終點(diǎn)值后垛叨,中間的值都是通過(guò)插值方式計(jì)算出來(lái)的,插值計(jì)算是通過(guò)timingFunction來(lái)指定柜某,timingFunction默認(rèn)為空嗽元,使用liner(勻速運(yùn)動(dòng))。例如莺琳,當(dāng)我們?cè)O(shè)置了一個(gè)position的動(dòng)畫(huà)还棱,設(shè)置了開(kāi)始值PointA與結(jié)束值PointB,它們的運(yùn)動(dòng)先計(jì)算PointA與PointB的中間運(yùn)動(dòng)值PointCenter惭等,而PointCenter是由timingFunction來(lái)指定值的珍手,并且動(dòng)畫(huà)默認(rèn)是直線勻速運(yùn)動(dòng)的。
CABasicAnimation遵循CAMediaTiming所以擁有CAMediaTiming的屬性。
CABasicAnimation為圖層屬性提供基本的單關(guān)鍵幀動(dòng)畫(huà)功能的對(duì)象琳要。
一個(gè) CABasicAniamtion 的實(shí)例對(duì)象只是一個(gè)數(shù)據(jù)模型
速度控制函數(shù)(CAMediaTimingFunction)
kCAMediaTimingFunctionLinear(線性):勻速寡具,給你一個(gè)相對(duì)靜態(tài)的感覺(jué),這個(gè)是默認(rèn)的動(dòng)畫(huà)行為。
kCAMediaTimingFunctionEaseIn(漸進(jìn)):動(dòng)畫(huà)緩慢進(jìn)入稚补,然后加速離開(kāi)
kCAMediaTimingFunctionEaseOut(漸出):動(dòng)畫(huà)全速進(jìn)入童叠,然后減速的到達(dá)目的地
kCAMediaTimingFunctionEaseInEaseOut(漸進(jìn)漸出):動(dòng)畫(huà)緩慢的進(jìn)入,中間加速课幕,然后減速的到達(dá)目的地厦坛。
CALayer *layer = [CALayer new];
layer.frame = CGRectMake(100, 100, 100, 100);
layer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer: layer];
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.duration = 2;
animation.fromValue = [NSValue valueWithCGPoint:layer.position];
animation.toValue = [NSValue valueWithCGPoint:CGPointMake(300, 300)];
//延時(shí) 1.0秒
animation.beginTime = CACurrentMediaTime() + 1.0;
// 指定動(dòng)畫(huà)重復(fù)是否累加
animation.cumulative = NO;
// 動(dòng)畫(huà)完成是否移除動(dòng)畫(huà)
animation.removedOnCompletion = YES;
// 設(shè)置移動(dòng)的效果為快入快出
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
// 設(shè)置無(wú)限循環(huán)動(dòng)畫(huà)
animation.repeatCount = HUGE_VALF;
// 設(shè)置動(dòng)畫(huà)完成時(shí),自動(dòng)以動(dòng)畫(huà)回到原點(diǎn)
animation.autoreverses = YES;
// 設(shè)置動(dòng)畫(huà)完成時(shí)乍惊,返回到原點(diǎn)
animation.fillMode = kCAFillModeForwards;
[layer addAnimation:animation forKey:nil];
-
注意
** animation中的postion動(dòng)畫(huà)fromValue與fromValue均為layer的position杜秸,position與frame中origin不是同一個(gè)東西哦,開(kāi)始弄了半天動(dòng)畫(huà)位置一直不對(duì)润绎,才知道這里還有一個(gè)錨點(diǎn)的知識(shí)點(diǎn)撬碟。**
三、layer的position和anchorPoint(錨點(diǎn))兩個(gè)屬性
1.position(位置)
position是layer中的anchorPoint點(diǎn)在superLayer中的位置坐標(biāo)莉撇。
2.anchorPoint(錨點(diǎn))
anchorPoint點(diǎn)是相對(duì)layer的呢蛤,兩者是相對(duì)不同的坐標(biāo)空間的一個(gè)重合點(diǎn)。默認(rèn)的anchorPoint是(0.5,0.5)棍郎,與positon重合其障,當(dāng)我們?cè)O(shè)置了錨點(diǎn)之后,我們的視圖會(huì)根據(jù)設(shè)置的錨點(diǎn)來(lái)來(lái)進(jìn)行相對(duì)偏移坝撑。
看了許多相關(guān)文章静秆,有些說(shuō)錨點(diǎn)是相對(duì)于postition的個(gè)人感覺(jué)有點(diǎn)問(wèn)題,親自測(cè)試了一下巡李,改變layer的position后錨點(diǎn)還是0.50.5抚笔,只有l(wèi)ayer的位置發(fā)生了變化,所以得出結(jié)論position是相對(duì)于錨點(diǎn)的描述侨拦,描述的是當(dāng)前l(fā)ayer的錨點(diǎn)在superlayer的位置
蘋(píng)果Doc相關(guān)說(shuō)明
animationWithKeyPath值
值 | 說(shuō)明 | value |
---|---|---|
transform.scale | 比例轉(zhuǎn)化 | @(0.8) |
transform.scale.x | 寬的比例 | @(0.8) |
transform.scale.y | 高的比例 | @(0.8) |
transform.rotation.x | 圍繞x軸旋轉(zhuǎn) | @(M_PI) |
transform.rotation.y | 圍繞y軸旋轉(zhuǎn) | @(M_PI) |
transform.rotation.z | 圍繞z軸旋轉(zhuǎn) | @(M_PI) |
cornerRadius | 圓角的設(shè)置 | @(50) |
backgroundColor | 背景顏色的變化 | (id)[UIColor purpleColor].CGColor |
bounds | 大小殊橙,中心不變 | [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)]; |
position | 位置(中心點(diǎn)的改變) | [NSValue valueWithCGPoint:CGPointMake(300, 300)]; |
contents | 內(nèi)容,比如UIImageView的圖片 | imageAnima.toValue = (id)[UIImage imageNamed:@"to"].CGImage; |
opacity | 透明度 | @(0.7) |
contentsRect.size.width | 橫向拉伸縮放 | @(0.4)最好是0~1之間的 |
anchorPoint | 錨點(diǎn)(相當(dāng)于改變position) | [NSValue valueWithCGPoint:CGPointMake(1, 1)] |
只要是CAlayer屬性中的支持隱式動(dòng)畫(huà)的都可以作為keypath的值
四狱从、CABasicAnimation
**CABasicAnimation為圖層屬性提供基本的單關(guān)鍵幀動(dòng)畫(huà)功能的對(duì)象最重要的三個(gè)屬性就是fromValue膨蛮、toValue、byValue **
屬性 | 說(shuō)明 |
---|---|
fromValue | 動(dòng)畫(huà)的效果變化的初始值 |
toValue | 動(dòng)畫(huà)效果變化的結(jié)束值(絕對(duì)值) |
byValue | byValue;動(dòng)畫(huà)效果變化的結(jié)束值(相對(duì)值) |
- fromValue和toValue不為空季研,動(dòng)畫(huà)的效果會(huì)從fromValue的值變化到toValue敞葛。
- fromValue和byValue都不為空,動(dòng)畫(huà)的效果將會(huì)從fromValue變化到fromValue+byValue与涡。
- toValue 和byValue都不為空惹谐,動(dòng)畫(huà)的效果將會(huì)從toValue-byValue變化到toValue持偏。
- 只有fromValue的值不為空,動(dòng)畫(huà)的效果將會(huì)從fromValue的值變化到當(dāng)前的狀態(tài)氨肌。
- 只有toValue的值不為空鸿秆,動(dòng)畫(huà)的效果將會(huì)從當(dāng)前狀態(tài)的值變化到toValue的值。
- 只有byValue的值不為空怎囚,動(dòng)畫(huà)的效果將會(huì)從當(dāng)前的值變化到(當(dāng)前狀態(tài)的值+byValue)的值卿叽。
相關(guān)資料
初探CALayer屬性
[Core Animation Programming Guide](Core Animation Programming Guide)
http://www.reibang.com/p/cd1bc0e82f4d
http://blog.jobbole.com/69111/
iOS 動(dòng)畫(huà)之CoreAnimation(CALayer)