探索阻尼動畫優(yōu)雅的實現(xiàn)方式

簡述

本文探討下如何在 Android 上實現(xiàn)阻尼動畫涧衙,首先 wiki 下阻尼的定義:是指任何振動系統(tǒng)在振動中嗅定,由于外界作用(如流體阻力碍彭、摩擦力等)和/或系統(tǒng)本身固有的原因引起的振動幅度逐漸下降的特性癣疟,也就是阻尼系統(tǒng)由兩個子系統(tǒng)組成(振子系統(tǒng)、阻力系統(tǒng))惕虑,先前寫過一篇 如何優(yōu)雅地在Android上實現(xiàn)iOS的圖片預覽
坟冲,就是一套阻尼動畫的實現(xiàn)

不知道阻尼動畫效果的同學可以去玩玩 iOS,iOS 的 UI 系統(tǒng)內置一套物理引擎溃蔫,幾乎所有的滾動界面都有阻尼動畫效果(越界回彈)

在討論阻尼動畫之前健提,我先講一下本人編寫動畫的歷程,分為 3 個階段(位置突變動畫伟叛,位置不突變動畫私痹,速度不突變的動畫

位置突變動畫

此動畫是 Android 里面最簡單的動畫,我們平常寫的 ValueAnimator 動畫、xml 動畫紊遵,其實都是位置突變的動畫雹锣,為什么叫它位置突變的動畫呢,比如我要把一個 View 漸變出來癞蚕,那么 alpha 數(shù)值應該是從 0 -> 1,但是假如在漸變動畫還沒有結束的時候(假如剛好播放到 0.5)辉哥,我又想把 View 給漸隱掉桦山,此時一般會播放一個 1 -> 0 的動畫,這里就產生了位置突變效應(從 0.5 突變成了 1)醋旦,造成的視覺效果就是視圖閃動(等同于游戲里面的跳幀)

位置不突變動畫

在上述動畫的基礎上恒水,對于第二段的漸隱動畫,我不從 1 -> 0 開始變化饲齐,我在播放漸隱動畫前先獲取 View 的透明度(0.5)钉凌,然后讓動畫從 0.5 -> 0 開始變化(視覺上沒有了閃動現(xiàn)象)

速度不突變動畫

位置不突變動畫一般都能滿足要求了(系統(tǒng)自帶的 ViewPropertyAnimator 就是位置不突變動畫),但是為什么 iOS 的動畫就看起來這么舒服捂人,而安卓的動畫看起來有點死板呢御雕?這邊就存在一個速度突變的問題

速度突變動畫↓

image

速度不突變動畫↓

image

圖片來自 谷歌動畫文檔

我想,應該可以很明顯的看出這兩者的動畫區(qū)別滥搭,當動畫的目標位置發(fā)生變化之后酸纲,動畫1 給人一種非常突兀的感覺,而動畫2 給人一種絲一般的順滑

速度不突變最理想的編寫方式就是引入一套物理引擎瑟匆,然后基于這套物理引擎開發(fā)動畫闽坡,但是成本很大,這也是為什么 iOS 的動畫這么絲滑的原因(內置物理引擎)

實現(xiàn)

谷歌大佬也發(fā)現(xiàn)了這個問題的愁溜,所以它在 support 26 版本中加入了 DynamicAnimation疾嗅,這是一套基于物理狀態(tài)的動畫系統(tǒng),顧明思議冕象,他內置了一套簡單的物理引擎代承,它有默認的兩個子類實現(xiàn) SpringAnimation(彈簧動畫)、FlingAnimation(滑動動畫)交惯,下面我就用這兩個動畫來實現(xiàn)我想要的阻尼動畫

先看一個簡單的 demo


SmartSelect_20180430-115555_Video Player.gif

思考一下次泽,如何實現(xiàn)這個動畫,最容易想到的就是用系統(tǒng)的 OverScroller席爽,但是此類的定制性比較差意荤,和阻尼效果差別很大。另一種方式就是分段動畫只锻,滾動的時候用 Scroller 實現(xiàn)玖像,越界的時候用 ValueAnimator 來實現(xiàn),這種方式首先編碼很麻煩:至少要分成 3 段動畫(滑動 -> 越界 -> 回彈),其次它是一個速度突變的動畫捐寥,表現(xiàn)上來說總會給人一種違和感

自定義阻尼系統(tǒng)

此方案就是自己模擬物理引擎笤昨,理論上可以實現(xiàn)物理引擎所支持的動畫,但是需要了解一定的物理知識和數(shù)學知識握恳,代碼實現(xiàn)繁瑣瞒窒,但是很有意思,有興趣的同學可以看我之前寫的一篇文章 如何優(yōu)雅地在Android上實現(xiàn)iOS的圖片預覽

借用 DynamicAnimation

這個是谷歌為了解決物理動畫而出的一個 support 庫乡洼,對它的描述叫 Physics-based motion崇裁。它的其中一個子類 SpringAnimation 其實就是彈簧動畫,也就是我想要的阻尼系統(tǒng)束昵。但是要實現(xiàn) demo 中的動畫拔稳,只有 SpringAnimation 是不夠的,還需要一個 fling 動畫锹雏,用于滑動巴比,剛好 DynamicAnimation 還有一個子類就是 FlingAnimation

那么接下來的問題就是如何結合這兩個動畫,擼出一個 SpringFlingAnimation

物理動畫的實現(xiàn)方式礁遵,無非就是逐幀計算轻绞,每一幀根據(jù)當前的 (位置、速度榛丢、加速度)計算出下一幀的(位置铲球、速度、加速度)晰赞,所以我只需要在越界的時候用 SpringAnimation 的邏輯去計算稼病,非越界的時候用 FlingAnimation 的邏輯去計算,就可以達到我們想要的效果

例:

image

如圖所示掖鱼,黑框是父布局然走,可以看做一個 ScrollView,橘色的框為內部的子 View戏挡,1 的時候上滑采用 FlingAnimation 去計算幀芍瑞,2 的時候因為越界了所以用 SpringAnimaiton 的邏輯來計算幀,3 的時候繼續(xù)采用 FlingAnimation

思路理清楚后是不是感覺很簡單褐墅,其實實現(xiàn)方式也很簡單拆檬,SpringAnimationFlingAnimation 里面的代碼本來就沒多少,阻尼系統(tǒng)的邏輯運算都封裝在 SpringForce 里面了妥凳,我們只需要繼承自 DynamicAnimation竟贯,復合一下兩個動畫的計算幀邏輯就可以了

PS: DynamicAnimation 的虛方法都是包權限的,也就是只有包權限的類才可以繼承

具體實現(xiàn)可以看我的 Github 項目 SpringFlingAnimation.java逝钥,上述 demo 的簡單實現(xiàn)代碼 SampleDampNestedScrollView.java

原文鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末屑那,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌持际,老刑警劉巖沃琅,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蜘欲,居然都是意外死亡益眉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門姥份,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呜叫,“玉大人,你說我怎么就攤上這事殿衰。” “怎么了盛泡?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵闷祥,是天一觀的道長。 經常有香客問我傲诵,道長凯砍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任拴竹,我火速辦了婚禮悟衩,結果婚禮上,老公的妹妹穿的比我還像新娘栓拜。我一直安慰自己座泳,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布幕与。 她就那樣靜靜地躺著挑势,像睡著了一般。 火紅的嫁衣襯著肌膚如雪啦鸣。 梳的紋絲不亂的頭發(fā)上潮饱,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音诫给,去河邊找鬼香拉。 笑死,一個胖子當著我的面吹牛中狂,可吹牛的內容都是我干的凫碌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吃型,長吁一口氣:“原來是場噩夢啊……” “哼证鸥!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤枉层,失蹤者是張志新(化名)和其女友劉穎泉褐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸟蜡,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡膜赃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了揉忘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跳座。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泣矛,靈堂內的尸體忽然破棺而出疲眷,到底是詐尸還是另有隱情,我是刑警寧澤您朽,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布狂丝,位于F島的核電站,受9級特大地震影響哗总,放射性物質發(fā)生泄漏几颜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一讯屈、第九天 我趴在偏房一處隱蔽的房頂上張望蛋哭。 院中可真熱鬧,春花似錦涮母、人聲如沸谆趾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棺妓。三九已至,卻和暖如春炮赦,著一層夾襖步出監(jiān)牢的瞬間怜跑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工吠勘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留性芬,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓剧防,卻偏偏與公主長得像植锉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子峭拘,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容