【Android 属性动画】属性动画 Property Animation 工作原理 ( 线性插值动画 | 非线性插值动画 | 动画计算 | 经过分数 | 插值分数 | 类型估值器)
生活随笔
收集整理的這篇文章主要介紹了
【Android 属性动画】属性动画 Property Animation 工作原理 ( 线性插值动画 | 非线性插值动画 | 动画计算 | 经过分数 | 插值分数 | 类型估值器)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、線性插值動畫示例
- 二、非線性插值動畫示例
- 三、動畫計算方式
- 四、時間經過分數 ( Elapsed Fraction )
- 五、插值分數 ( Interpolated Fraction )
- 六、類型估值器 ( TypeEvaluator )
一、線性插值動畫示例
線性插值動畫示例 :
- 1.動畫內容 : 上圖描述了一個假設的組件 , 修改其 x 屬性生成動畫 , 該屬性代表組件在屏幕上水平方向的位置 ;
- 2.動畫時長 : 40ms ( 毫秒 ) , 動畫從開始到結束 , 持續時間 40ms ( 毫秒 ) ;
- 3.屬性范圍 : 屬性 x 在動畫開始時為 0 px ( 像素 ) , 動畫結束時 為 40 ms ( 毫秒 ); 該動畫需要在 40ms 內移動 40px (像素 ) ;
- 4.動畫刷新頻率 : 默認的幀刷新頻率是 10ms ( 毫秒 ) , 每隔 10ms ( 毫秒 ) 在水平方向上移動 10px ( 像素 ) ;
- 5.動畫停止 : 在 40ms ( 毫秒 ) 結尾時 , 動畫停止 , 該組件停在水平方向 40px ( 像素 ) 的位置 ;
- 6.線性插值器 : 該示例中 , 動畫使用的插值器是線性插值器 , 即該組件以勻速運動的方式生成動畫 ;
二、非線性插值動畫示例
非線性插值動畫示例 :
- 1.非線性插值器 : 可以給動畫指定一個非線性差值器 , 動畫會以加速或減速形式運動 ;
- 2.示例描述 : 上圖中描述了一個假設的組件 , 其在動畫開始階段加速運動 , 動畫結束階段減速運動 ;
- 3.動畫描述 : 該組件仍然是在 40ms ( 毫秒 ) 內移動 40px ( 像素 ) ;
- 4.開始階段 : 在開始階段 , 開始位置 到 中點位置 , 組件加速運動 ;
- 5.結束階段 : 在結束階段 , 中點位置 到 結束位置 , 組件減速運動 ;
組件在開始和結尾時間段運行的距離 , 要少于中間時間階段的運行距離 ;
三、動畫計算方式
屬性動畫系統中計算動畫的重要組件 :
- 1.ValueAnimator ( 值動畫類 ) : 該對象追蹤動畫的計時時間 和 屬性值設置 , 如 動畫已經運行了多長時間 , 以及當前屬性動畫當前的屬性值 ;
- 2.ValueAnimator 封裝內容 :
- ① TimeInterpolator ( 時間差值器 ) : 其中定義了一個動畫的時間差值器 ;
- ② TypeEvaluator ( 類型估值器 ) : 定義了如何計算 生成屬性動畫的屬性值 ;
- 3.示例 : 如在上述非線性插值動畫示例中 , 使用的 TimeInterpolator ( 時間差值器 ) 是 AccelerateDecelerateInterpolator , TypeEvaluator ( 類型估值器 ) 是 IntEvaluator ;
四、時間經過分數 ( Elapsed Fraction )
時間經過分數 ( Elapsed Fraction ) 說明 :
- 1.設置參數 : 啟動屬性動畫 , 需要先創建 ValueAnimator , 設置動畫的持續時間 , 設置 動畫執行期間內的 屬性值改變的 起始值 和 終止值 ;
- 2.執行動畫 : 調用動畫的 start() 方法后 , 動畫開始執行 ;
- 3.出現 時間經過分數 ( Elapsed Fraction ) : 在動畫執行過程中 , ValueAnimator 基于動畫的總時間 TTT , 和 已經經過的時間 ttt , 計算出 時間經過分數 tT\cfrac{t}{T}Tt? , 該分數取值范圍 [0,1][0, 1][0,1] ;
- 4.時間經過分數 ( Elapsed Fraction ) 說明 : 時間經過分數 ( Elapsed Fraction ) 代表了動畫完成的百分比 , 000 代表 0%0\%0% 動畫剛開始 , 111 代表 100%100\%100% 動畫完成 ;
- 5.舉例說明 : 在上面的 線性插值動畫示例 中 , 在 10ms 時 , 其 時間經過分數 ( Elapsed Fraction ) 是 tT=1040=0.25\cfrac{t}{T} = \cfrac{10}{40}=0.25Tt?=4010?=0.25 ;
五、插值分數 ( Interpolated Fraction )
插值分數 ( Interpolated Fraction ) :
- 1.計算方式 : 當 ValueAnimator 計算出 時間經過分數 ( Elapsed Fraction ) 后 , 需要調用當前設置的 時間差值器 ( TimeInterpolator ) , 計算出 插值分數 ( interpolated fraction ) ;
- 2.插值分數 ( Interpolated Fraction ) 與 經過分數 ( Elapsed Fraction ) 對應關系 : 經過分數 通過 設置的 時間插值信息進行計算得出插值分數 ;
- 3.非線性插值示例 : 在上述 非線性插值動畫示例 中 , 在開始時 , 動畫處于緩慢加速狀態中 , 在 10ms 時刻 , 其差值分數大約是 0.150.150.15 , 此時經過分數是 0.250.250.25 , 比插值分數要大 ;
- 4.線性插值示例 : 在上述 線性插值動畫示例 中 , 任何一個時刻的 經過分數 都 等于 插值分數 ;
六、類型估值器 ( TypeEvaluator )
類型估值器 ( TypeEvaluator ) :
- 1.類型估值器 ( TypeEvaluator ) 作用 : 當 插值分數 ( Interpolated Fraction ) 被計算出來后 , ValueAnimator 會調用適當的 類型估值器 ( TypeEvaluator ) , 計算當前正在運行的動畫的屬性值 ;
- 2.計算方式 : 基于 當前的 插值分數 ( Interpolated Fraction ) FcF_cFc? , 開始時的屬性值 VsV_sVs? , 結束時的屬性值 VeV_eVe? , 當前屬性值 VcVcVc :
Vc=Vs+Fc(Ve?Vs)V_c=V_s + F_c(V_e-V_s)Vc?=Vs?+Fc?(Ve??Vs?) - 3.示例 : 上述 非線性插值示例 10ms 時刻 , 當前的 插值分數 ( Interpolated Fraction ) Fc=0.15F_c=0.15Fc?=0.15 , 開始時的屬性值 Vs=0V_s=0Vs?=0 , 結束時的屬性值 Ve=40V_e=40Ve?=40 , 當前屬性值 : Vc==Vs+Fc(Ve?Vs)=0+0.15×(40?0)=6Vc==V_s + F_c(V_e-V_s)=0+0.15\times(40-0)=6Vc==Vs?+Fc?(Ve??Vs?)=0+0.15×(40?0)=6
當前的屬性值是 666 ;
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的【Android 属性动画】属性动画 Property Animation 工作原理 ( 线性插值动画 | 非线性插值动画 | 动画计算 | 经过分数 | 插值分数 | 类型估值器)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 属性动画】属性动画 P
- 下一篇: 【Android 应用开发】Paint