一款Loading動(dòng)畫的實(shí)現(xiàn)思路(三)

?感謝大家對(duì)前兩篇的支持,在第一篇的評(píng)論中,簡(jiǎn)友YouXianMing提出了更好的實(shí)現(xiàn)思路,同樣在評(píng)論中,原動(dòng)效設(shè)計(jì)者 moonjoin親自現(xiàn)身捧場(chǎng),非常感謝!?這也說(shuō)明以分享來(lái)拋磚引玉是有效果的。

慣例,為了讓第一次來(lái)的同學(xué)對(duì)本系列有所了解,我先貼一下?完整的效果圖,有興趣的同學(xué),請(qǐng)移步本系列第一篇,可以的話請(qǐng)多提提建議,非常感謝,以下是效果圖

不多說(shuō)了,我們開(kāi)始第三篇。

前兩篇?聊到了一些技術(shù),而這一篇我們則側(cè)重于思路,一起來(lái)聊一下階段3和階段4。

那么,我們先看一下階段3的效果圖,慣例,前幾個(gè)階段的動(dòng)畫我們用灰色 正常速度表示,當(dāng)前階段則使用彩色慢速,如圖


階段3

有的同學(xué)要說(shuō)了,這個(gè)太簡(jiǎn)單了,就是一平移嘛。

沒(méi)錯(cuò),就是平移。可能和我一樣,很多同學(xué)最早接觸的動(dòng)畫就是平移、旋轉(zhuǎn)和縮放,?可以算基本功了。

所以階段3,我們就不多聊了,方案有很多種,比如修改layer的position.y、transform.translation.y都可以(對(duì)此不熟悉的同學(xué)請(qǐng)戳官方文檔中的可動(dòng)畫的屬性動(dòng)畫支持的key path),甚至可以用本系列第二篇提到的stroke方案。

階段3不是沒(méi)有價(jià)值,因?yàn)閺碾A段3中我們可以得到一個(gè)重要結(jié)論,那就是:我們可以利用經(jīng)驗(yàn)來(lái)解決問(wèn)題

這?句看上去像是廢話,不要急,我們接下來(lái)要看看,?把分解問(wèn)題和這個(gè)結(jié)論結(jié)合起來(lái),會(huì)是什么效果。

下面是階段4的效果圖,大家請(qǐng)看


階段4

?是不是感覺(jué)比前3個(gè)階段復(fù)雜,為什么會(huì)有這種感覺(jué)呢?

一個(gè)重要的原因是,我們覺(jué)察到階段4是多個(gè)動(dòng)畫組合而成的,不像前3個(gè)階段那樣是單個(gè)動(dòng)畫。

?像我一樣單核的同學(xué)估計(jì)要瘋了,恩,這兒在變,?恩?那兒怎么也在變?
所以我們?最好還是把這組動(dòng)畫分解一下,一個(gè)一個(gè)來(lái)處理

但是怎么分解呢,?一時(shí)可能沒(méi)思路,那我們不如來(lái)描述一下這個(gè)動(dòng)畫吧。
比如這樣:“一個(gè)圓被頭頂上的線砸扁了,線砸進(jìn)圓?里,?線變粗了。”

但仔細(xì)看看,砸進(jìn)去的過(guò)程中,線在圓外的部分是細(xì)的,在圓內(nèi)的部分是粗的,有點(diǎn)復(fù)雜,?不如就以圓為界,分成一細(xì)一粗兩條線吧。

我們?cè)倜枋鲆淮危骸耙粋€(gè)圓被頭頂上的細(xì)線砸扁了,細(xì)線慢慢消失了,圓里面慢慢出現(xiàn)了一條粗線。”

這個(gè)描述里都有什么?
圓漸漸扁了,圓外的細(xì)線漸漸消失了,圓內(nèi)的粗線漸漸出現(xiàn)了。
漸漸,就是動(dòng)畫的意思。

這樣我們就分解出了3個(gè)簡(jiǎn)單的動(dòng)畫,
為了更直觀,我們給圓、細(xì)線、粗線分別染上不同的顏色,請(qǐng)看下圖

階段4 多彩版

思路是不是已經(jīng)出來(lái)了,圓變扁,大家應(yīng)該想到了基本功里的縮放(transform.scale.y),線消失與線出現(xiàn),有的同學(xué)可能想到了本系列第二篇提到的stroke方案(CAShapeLayer的strokeStart和strokeEnd)。

至此,我們已經(jīng)通過(guò)描述問(wèn)題把動(dòng)畫分解了,并且發(fā)現(xiàn)可以利用經(jīng)驗(yàn)實(shí)現(xiàn)分解后的動(dòng)畫

接下來(lái)就是找重要節(jié)點(diǎn)的值了。

我們發(fā)現(xiàn),3者的交界是圓的頂點(diǎn),看來(lái)這是一個(gè)重要的節(jié)點(diǎn)。
在本示例中,我們假設(shè)動(dòng)畫結(jié)束時(shí),圓的縮放系數(shù)scale為0.8,請(qǐng)看下圖

圖中紅點(diǎn)就是圓的頂點(diǎn),由可知,動(dòng)畫開(kāi)始時(shí),頂點(diǎn)y坐標(biāo)就是center.y - r,結(jié)束時(shí)就是在這個(gè)基礎(chǔ)加上縮放的部分2r * (1 - scale),即center + 2r * (1 - scale)處。

再看細(xì)線,細(xì)線的長(zhǎng)度可以從階段3中拿到,動(dòng)畫開(kāi)始時(shí)有長(zhǎng)度(下圖中灰色線),動(dòng)畫結(jié)束時(shí),SS、SE?重合,線就消失了(下圖中藍(lán)色圓的頂點(diǎn)),如圖


細(xì)線

再看粗線,?我們假設(shè)結(jié)束時(shí),粗線的底部位于圓未變形時(shí)的圓心處,動(dòng)畫開(kāi)始時(shí)SS、SE重合,線看不到(下圖中灰色圓的頂點(diǎn)),動(dòng)畫結(jié)束時(shí),SS、SE分別到了不同位置,線就出現(xiàn)了(下圖中藍(lán)色線),如圖


粗線

?還不是很清楚的同學(xué),可以在紙上畫一畫,畫著畫著就明白了。
至此,關(guān)鍵節(jié)點(diǎn)的值都找到了。

下面我們來(lái)看一個(gè)問(wèn)題。
有的同學(xué)注意到了,這個(gè)圓的縮放和我們?常用的不一樣,?常用的是圓心不變,圓頂點(diǎn)和底點(diǎn)分別向圓心靠攏,形成橢圓的效果。而這個(gè)動(dòng)畫中,是圓底點(diǎn)不動(dòng),頂點(diǎn)和圓心都向底點(diǎn)靠攏。

有經(jīng)驗(yàn)的同學(xué)可能要提到一個(gè)詞了,anchor point ,這個(gè)我先截一張官方文檔Core Animation Programming Guide中的示意圖,圖中用旋轉(zhuǎn)transform示意了anchor point和position。

不嚴(yán)謹(jǐn)?shù)恼f(shuō),transform時(shí),anchor point就是不動(dòng)的那個(gè)點(diǎn),其它點(diǎn)基于anchor point進(jìn)行?計(jì)算(具體大家還是要看一下Core Animation Programming Guide文檔,或它的翻譯版)。

具體到本例中,anchor point應(yīng)該在圓的底點(diǎn),這樣縮放時(shí),就是底點(diǎn)不動(dòng),其他點(diǎn)基于底點(diǎn)計(jì)算了。

理解了anchor point,有的同學(xué)寫出了這一句。

self.arcToCircleLayer.anchorPoint = CGPointMake(0.5, 1);

這一句邏輯是對(duì)的,x等于0.5即anchor point在x軸上位于圓的中心,y?等于1即anchor point在y軸上位于圓的底點(diǎn),和我們前文中的說(shuō)到的要求一致。

但執(zhí)行時(shí),卻會(huì)驚喜的發(fā)現(xiàn),圓的位置發(fā)生了一次突變,如下圖


這是怎么了,想一想,圓的大小與位置??可以認(rèn)為是frame的體現(xiàn),查看一下CALayer的文檔,在frame的Discussion中,有這么一句

the frame rectangle is a computed property that is derived from the values in the bounds, anchorPoint and position properties.

也就是說(shuō)frame是根據(jù)bounds、anchorPoint和position這3個(gè)屬性算出來(lái)的,我們沒(méi)有改變bounds和position,而單單改變了anchorPoint,frame自然也跟著變了。

怎么解決呢,答案依然在frame的Discussion中,如下

When you assign a new value to this property, the layer changes its position and bounds properties to match the rectangle you specified.

文中的this property就是frame,這段文字說(shuō)明,我們給frame指定新值,layer會(huì)自動(dòng)調(diào)整position和bounds。
那就簡(jiǎn)單了,我們?cè)O(shè)置anchor point后,再將圓的frame設(shè)置回之前的值,如下

CGRect frame = self.arcToCircleLayer.frame;
self.arcToCircleLayer.anchorPoint = CGPointMake(0.5, 1);
self.arcToCircleLayer.frame = frame;

篇幅關(guān)系,我就不貼大段代碼了,完整代碼大家可以查看GitHub上OneLoadingAnimation工程的OneLoadingAnimationStep4目錄。

為方便大家查看,我貼了一點(diǎn)代碼,說(shuō)明一下代碼的結(jié)構(gòu),如下

// 第4階段
- (void)doStep4 {
    [self doStep4a];
    [self doStep4b];
    [self doStep4c];
}
// 4階段a:小圓變形
- (void)doStep4a {}

// 4階段b:逐漸消失的豎線
- (void)doStep4b {}

// 4階段c:逐漸出現(xiàn)的豎線
- (void)doStep4c {}

用1、2、3來(lái)表示某階段,用a、b、c來(lái)表示階段內(nèi)某個(gè)動(dòng)畫,這顯然不是良好的命名,但在這個(gè)示例中,這樣也許更清晰。

篇幅所限,我們?cè)谙乱黄性倭暮罄m(xù)的階段,大家有興趣的話,可以分解一下后面的動(dòng)畫,?找一找感覺(jué)。

本文中提到解決問(wèn)題的思路,?相當(dāng)一部分得益于V.Anton Spraul的《像程序員一樣思考》,ISBN號(hào)9787115383396,有興趣的同學(xué)可以看一下,寫的很好。

第三篇到這就告一段落了,非常感謝大家的觀看,我們下一篇再會(huì)。

階段4中我簡(jiǎn)化的部分

大家仔細(xì)查看原動(dòng)效的話,會(huì)發(fā)現(xiàn)圓的變化是不規(guī)則的。
原設(shè)計(jì)更符合直覺(jué),比如大家把球放到地上,拿一個(gè)手指去按它,手指按的部分和球與地面接觸的部分,變形度肯定是不一樣的。
為了實(shí)現(xiàn)簡(jiǎn)單,我將圓的變化處理成了規(guī)則的變化,即從圓漸漸變成了橢圓。
后續(xù)我會(huì)單獨(dú)開(kāi)一篇和大家聊一下圓不規(guī)則變化的實(shí)現(xiàn),敬請(qǐng)期待。

完整代碼

請(qǐng)參考GitHub上OneLoadingAnimation的OneLoadingAnimationStep3和OneLoadingAnimationStep4目錄。

本系列的?傳送門

鳴謝及推薦

相關(guān)鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,694評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,672評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,965評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,690評(píng)論 6 413
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 56,019評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評(píng)論 3 449
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,188評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,718評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,438評(píng)論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,667評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,845評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,252評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,590評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,384評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,635評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容

  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果,實(shí)現(xiàn)這些動(dòng)畫的過(guò)程并不復(fù)雜,今天將帶大家一窺iOS動(dòng)畫全貌。在這里你可以看...
    F麥子閱讀 5,140評(píng)論 5 13
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果,實(shí)現(xiàn)這些動(dòng)畫的過(guò)程并不復(fù)雜,今天將帶大家一窺ios動(dòng)畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,551評(píng)論 6 30
  • 111. [動(dòng)畫系統(tǒng)]如何將其他類型的動(dòng)畫轉(zhuǎn)換成關(guān)鍵幀動(dòng)畫? 動(dòng)畫->點(diǎn)緩存->關(guān)鍵幀 112. [動(dòng)畫]Unit...
    胤醚貔貅閱讀 13,145評(píng)論 3 90
  • 感謝大家對(duì)前幾篇的支持,這一篇,我們一鼓作氣,把整個(gè)動(dòng)畫完成。 慣例,為了方便第一次來(lái)的同學(xué),我先貼一下動(dòng)畫完成的...
    柯?tīng)€閱讀 5,391評(píng)論 18 74
  • 本文將分為四個(gè)部分介紹核心動(dòng)畫: 第一部分將介紹核心動(dòng)畫的基本概念。 第二部分將介紹動(dòng)畫實(shí)現(xiàn)原理。 第三部分將介紹...
    曲年閱讀 3,212評(píng)論 1 9