一训枢、layer有一個(gè)屬性叫做animate,用來做動(dòng)畫忘巧,直接加在layer的名字上恒界,例如layerB.animate
它有兩個(gè)參數(shù):
第一個(gè)參數(shù)是必須的,沒有它就沒有動(dòng)畫砚嘴,他是在描述動(dòng)畫的屬性(property)例如要在x方向上移動(dòng)500px十酣,在y方向上移動(dòng)100px,以x為軸旋轉(zhuǎn)180度际长,以y為軸旋轉(zhuǎn)360度等等耸采。properties是animate的參數(shù),故縮進(jìn)在其麾下也颤,而x:洋幻、y:、rotation是properties的具體值翅娶,故縮進(jìn)在properties的麾下文留。
第一個(gè)參數(shù)除了通過設(shè)置屬性來實(shí)現(xiàn)動(dòng)畫外,還可以通過設(shè)置layer的目標(biāo)狀態(tài)來實(shí)現(xiàn)竭沫。語法為(layerA.animate “stateX”燥翅,)。這里千萬不要忘記[ , ]沒有這個(gè)小家伙不起作用蜕提。此種方式的options與前一種寫法一致森书。
第二個(gè)參數(shù)是可選擇的(說是“個(gè)”,其實(shí)是一群谎势,他們級別與屬性相同)凛膏,進(jìn)一步去修改調(diào)整動(dòng)畫的狀態(tài)和屬性,例如有time脏榆,curve等等猖毫。它與properties同級別
二、另外须喂,關(guān)于layer的一個(gè)屬性叫做“html”吁断,其作用就像是在一個(gè)普通的Layer(非TextLayer)上寫文字,可以將? html: "FUCK THE WORLD"? 寫在layer的縮進(jìn)屬性中坞生,也可以在底下再起一行仔役,寫成 layerA.html = "FUCK THE WORLD" .
另外,修飾這個(gè)html用的是“style”屬性是己,用的是駝峰命名法的CSS屬性又兵。每一個(gè)layer都有style的屬性,它是將CSS的屬性都引入進(jìn)來進(jìn)行修飾的手段卒废,在CSS中屬性的復(fù)合詞中是用 “-” 來命名的沛厨,并且全部都小寫乘盼,例如background-color , padding-top,在coffeescript(以及JS)中是用駝峰命名法的俄烁,例如backgroundColor绸栅,paddingTop。
對于style的語法來說页屠,是這樣的 layerA.style =粹胯,然后換行在其子層級中寫屬性和屬性值(這一對兒在CSS中被稱之為一條聲明),兩者都用雙引號引起來(這表示難道是引用CSS的意思嗎辰企,哈哈哈哈)风纠,同時(shí)中間用冒號隔開(這一點(diǎn)在CSS中也一樣)。例如“outline” : “1px solid red” 牢贸,注意一條屬性對寫完后要加“竹观,”換號寫另一條(不加也沒關(guān)系,似乎是在父子層之間若有“潜索,”是必要的臭增,同層間也無所謂了的感覺)。而一個(gè)屬性若包含多個(gè)屬性值時(shí)竹习,可以用空格隔開來寫不同屬性值誊抛。
另外對于設(shè)定或者修改一條屬性時(shí),也可以使用layerA.style["outline"] = “1px solid red” 的方式來寫整陌。
這里對其中一項(xiàng)聲明作說明拗窃,lineHeight表示的是行高,而這個(gè)行高表示的是一個(gè)高度泌辫,文字寫在這個(gè)高度里随夸,并且文字總是居于高度的中線處(無論文字大小)震放。
三宾毒、有趣的是,上邊提到的動(dòng)畫也可以被賦值到一個(gè)名字?(如同給一個(gè)新建圖層賦值到一個(gè)名字中一樣)里以方便將來指定或者調(diào)用澜搅。例如在設(shè)定動(dòng)畫時(shí)使用 ? XXanimation = Layer.animate ?來指定動(dòng)畫伍俘。然后在后續(xù)中可以使用 ?XXanimation.onAnimationEnd ?-> ?來對這個(gè)動(dòng)畫進(jìn)行結(jié)束監(jiān)聽邪锌。要是不指定這個(gè)名字勉躺,想要監(jiān)聽就不太方便制定了。
四觅丰、這里提到了動(dòng)畫對象的一個(gè)事件——on Events.AnimationEnd饵溅,它的監(jiān)聽可以簡寫為onAnimationEnd -> ?利用這種監(jiān)聽可以將動(dòng)畫片段進(jìn)行連接,動(dòng)畫A結(jié)束后開始動(dòng)畫B妇萄,動(dòng)畫B結(jié)束后再開始動(dòng)畫C等等蜕企。
這里需要注意的一點(diǎn)是:(動(dòng)畫開始)layer.animate與(監(jiān)聽動(dòng)畫結(jié)束)layer.onAnimationEnd 是在邏輯同一層級的咬荷。而在動(dòng)畫片段接續(xù)式中,后續(xù)動(dòng)畫是上一個(gè)動(dòng)畫結(jié)束監(jiān)聽的子層級轻掩。因此整體會(huì)形成一種向左上角登頂?shù)碾A梯式結(jié)構(gòu)幸乒。這解決了時(shí)間與動(dòng)畫之間的關(guān)系。
??on "end" , -> ?可能是一種極簡的用法唇牧,不推薦罕扎。而這個(gè)事件不同于事件當(dāng)中的特殊一類——Change Events,可以用來監(jiān)聽任意對象的一些屬性值丐重,并且能夠獲惹徽佟(返回)實(shí)時(shí)的該屬性值,因此經(jīng)常與Utils的modulate混合使用扮惦,來做范圍映射臀蛛。范圍映射建立的是兩個(gè)不同的屬性量之間的換算關(guān)系。它能夠解決一個(gè)量隨另一個(gè)量變化的問題崖蜜。
五浊仆、關(guān)于modulate(調(diào)制,tiaozhi)
它最終得到的是一個(gè)因變量豫领,這個(gè)值可以賦給某一個(gè)對象的一個(gè)屬性氧卧,使這個(gè)屬性按照所賦值來變化。
Utils.modulate有四個(gè)參數(shù):
第一個(gè)是一個(gè)變量氏堤,并且是自變量(用戶導(dǎo)致的變量)沙绝,往往使用監(jiān)聽值(監(jiān)聽得到由于用戶的行為導(dǎo)致某個(gè)屬性的實(shí)時(shí)數(shù)值)來獲取。
第二個(gè)參數(shù)是一個(gè)數(shù)值范圍鼠锈,它表示的是自變量的變化范圍闪檬。
第三個(gè)參數(shù)也是一個(gè)數(shù)值范圍,它表示的是因變量的變化范圍购笆。
第四個(gè)參數(shù)是一個(gè)布爾值粗悯,表示是否允許因變量取值超過因變量的范圍。默認(rèn)是不允許的同欠,即最大最小值即為第三參數(shù)样傍。
六、Spring的屬性
將彈簧的變化性質(zhì)應(yīng)用到動(dòng)畫的各種屬性中铺遂。
其一是 friction衫哥,指的是摩擦力,數(shù)值越大襟锐,摩擦消耗的能量越快撤逢。彈簧越快回到最終狀態(tài)。
另外一個(gè)是tension,指的是拉力(張力)蚊荣,數(shù)值越大初狰,彈簧被拉伸的力越大。
velocity指的是速度互例,表示的應(yīng)該是簡諧運(yùn)動(dòng)的最大速度
tolerance指的是 忍受力 奢入,值越大,活動(dòng)范圍縮小媳叨,越呆滯
可以使用語法:curve: Spring(friction: 10)
七俊马、過渡切換
從一個(gè)狀態(tài)切換到另一個(gè)狀態(tài) 為了豐富界面的情緒感受 往往采用一些過渡動(dòng)畫,其中一項(xiàng)是默認(rèn)狀態(tài)時(shí)scale值為0肩杈,而馬上為之加一個(gè)動(dòng)畫使其scale值變?yōu)?柴我,在這個(gè)過程中可以使用curve來對其做修飾,更有動(dòng)感扩然。
另一種很酷的方式是首先使對象隱藏在某個(gè)側(cè)面(上側(cè)艘儒、下側(cè)、左側(cè)或者右側(cè))——設(shè)置其opacity為0夫偶,然后利用動(dòng)畫或者狀態(tài)轉(zhuǎn)換使其發(fā)生位移——移動(dòng)到應(yīng)該在的位置界睁,并且opacity變?yōu)?.
這些變化的過程都可以用Spring來做修飾。很有動(dòng)感
八兵拢、for-loop以及其復(fù)合使用
用for-loop可以一次性生成多個(gè)對象——for i in [0..X]翻斟,一個(gè)變量 i 在這個(gè)數(shù)組中從第一個(gè)值0取到最后一個(gè)值X,取值一圈说铃。此時(shí)若在其子層級任意新建圖層(不用寫[ ])访惜,就相當(dāng)于命令這個(gè)新建圖層聽從 其父層級的 循環(huán)命令(從0循環(huán)到X,跑X+1次),從而成成多個(gè)對象腻扇,再使用 i 的數(shù)學(xué)函數(shù)來定義x以及y债热,從而確定每一個(gè)對象的位置。
每一個(gè)對象是由它所取的值 “i” 誕生的幼苛,同時(shí)各種屬性也可以通過 “i” 來定義窒篱。
這種for循環(huán)還可以復(fù)合使用,在for n in[1..N]的子層舶沿,再寫一個(gè)for m in[1..M]墙杯,就是他的復(fù)合使用,這類似于布爾運(yùn)算的“且”括荡,在下一子層創(chuàng)建新圖層高镐,此時(shí)便可得到M*N個(gè)圖層,(對第一個(gè)數(shù)組的每一個(gè)數(shù)值都循環(huán)一次第二數(shù)組中的每一個(gè)數(shù)值)
這個(gè)事例讓我加深了對X和Y的理解一汽,可以將其進(jìn)一步理解為行 列的概念避消,y與行相關(guān),x與列相關(guān)召夹,例如在上例中若設(shè)定x:50*m 表示的是生成m列岩喷,某一列的頭到下一列的頭的距離為50,若設(shè)定y:50*m 表示的則是生成m行监憎,某一行的頭到下一行的頭的距離為50纱意。
另外,xy的值鲸阔,是以最親最近的父圖層的左上角為原點(diǎn)的坐標(biāo)值(center同理)偷霉。可以為一個(gè)對象定位褐筛,也可以利用位置差制作移動(dòng)動(dòng)畫类少。
九、數(shù)值的引用
變量可以采用 “ #{i} ” 的方式進(jìn)行輸入或者輸出渔扎。
例如在 layer.html = "#{a}" 是在對應(yīng)的對象里輸出對應(yīng)的數(shù)值硫狞。又如在“rgba(#{R1},#G{G1},#B{B1},1)” 中就是變量數(shù)值的輸入晃痴。
R1是a的函數(shù)酬凳,G1是b的函數(shù)。
十遭庶、animationOptions是layer的另一個(gè)屬性宁仔,它有一系列參數(shù)(都是可選的)其一是delay后邊跟的是一個(gè)數(shù)值。(其它還包括curve峦睡、curveOptions翎苫、time、repeat榨了、colorModel煎谍、instant)
注意:它是直接用來修飾圖層對象,而不是動(dòng)畫對象龙屉。容易誤解為用來修飾動(dòng)畫對象呐粘。一旦被設(shè)定满俗,就是該圖層參與的所有動(dòng)畫都會(huì)被設(shè)定,這個(gè)被設(shè)定的屬性就變成了圖層的屬性作岖,相伴終生唆垃。
另外,這個(gè)屬性實(shí)質(zhì)上就是單獨(dú)指定layerA.animate的第二參數(shù)options痘儡。只是設(shè)定在animate的參數(shù)中時(shí)辕万,只是對這個(gè)animate的動(dòng)畫起作用,而對其他動(dòng)畫并沒有影響沉删。
當(dāng)然也可以只是對一個(gè)圖層對象的某一狀態(tài)進(jìn)行修飾渐尿。例如