摘要:通過時(shí)間扭曲實(shí)現(xiàn)緩動(dòng)動(dòng)畫經(jīng)常會(huì)見到各類緩動(dòng)函數(shù),在里面有現(xiàn)成的等緩動(dòng)效果直接用。這次的實(shí)踐在一個(gè)封裝的基礎(chǔ)上,請(qǐng)參考精靈封裝緩動(dòng)動(dòng)畫的本質(zhì),是在單位時(shí)間內(nèi)移動(dòng)不同的距離。
通過時(shí)間扭曲實(shí)現(xiàn)緩動(dòng)動(dòng)畫
經(jīng)常會(huì)見到各類緩動(dòng)函數(shù),在CSS里面有現(xiàn)成的bounce、elastic等緩動(dòng)效果直接用。如果在canvas動(dòng)畫中,我們要實(shí)現(xiàn)這些緩動(dòng)函數(shù)。直接去思考怎么處理挺頭疼的,介紹一種不錯(cuò)的實(shí)現(xiàn)方式,源自《HTML5 Canvas核心技術(shù)》。
這次的實(shí)踐在一個(gè)封裝的基礎(chǔ)上,請(qǐng)參考:canvas精靈封裝
Begin緩動(dòng)動(dòng)畫的本質(zhì),是在單位時(shí)間內(nèi)移動(dòng)不同的距離。
一個(gè)簡單的公式:距離 = 速度 × 時(shí)間;
要實(shí)現(xiàn)距離緩動(dòng),只有兩種方式:
要么保持時(shí)間正常流動(dòng),實(shí)現(xiàn)速度緩動(dòng);
要么保持速度不變實(shí)現(xiàn)時(shí)間扭曲;
下圖是elastic效果的距離與時(shí)間函數(shù),我亂拿了一個(gè)三角函數(shù)圖像,忽略掉負(fù)軸就好
△V = △S / △T,理論上對(duì)距離/時(shí)間曲線進(jìn)行求導(dǎo),得到速度的變化曲率,改變速度也能實(shí)現(xiàn)。
這次實(shí)現(xiàn)的是保持速度不變,扭曲時(shí)間實(shí)現(xiàn)緩動(dòng):
1、每個(gè)動(dòng)畫時(shí)間固定,通過時(shí)間能獲取到動(dòng)畫進(jìn)度:先給出時(shí)間扭曲函數(shù):
f(x) = ((1 - cos(x * pi * 3)) * (1-x)) + x
轉(zhuǎn)換成代碼:
var makeElastic = function (passes) {// passes是跳動(dòng)的次數(shù) passes = passes || 3; return function (percentComplete) { return ((1-Math.cos(percentComplete * Math.PI * passes)) * (1 - percentComplete)) + percentComplete; }; };
函數(shù)圖像:
通過Sprite封裝的behavior來實(shí)現(xiàn)時(shí)間扭曲
var moveBall = { updateBallPosition: function(elapsed){ if (arrow === LEFT){ ball.left -= ball.velocityX * (elapsed/1000); } else{ ball.left += ball.velocityX * (elapsed/1000); } }, execute: function(ball, context,time){ // 核心! // 這里的animationElapsed是被扭曲過的時(shí)間 // getElapsedTime()就是上面的makeElastic // 經(jīng)過一些封裝,傳入t得出扭曲過的時(shí)間 var animationElapsed = pushAnimationTimer.getElapsedTime(), elapsed; elapsed = animationElapsed - this.lastTime; this.updateBallPosition(elapsed); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87925.html
摘要:非常的龐大,而且它是完全為設(shè)計(jì)而生的動(dòng)效庫。它運(yùn)行于純粹的之上,是目前最強(qiáng)健的動(dòng)畫資源庫之一??赡苁莿?chuàng)建滾動(dòng)特效最好用的工具,它支持大量的瀏覽器,只要它們支持和特性。可以通過安裝吊炸天了,接近現(xiàn)實(shí)生活中的物理運(yùn)動(dòng)碰撞慣性動(dòng)畫庫。 收集日期為2019-02-28,★代表當(dāng)時(shí)的該項(xiàng)目在github的star數(shù)量 Animate.css 56401 ★ 一個(gè)跨瀏覽器的動(dòng)效基礎(chǔ)庫,是許多基礎(chǔ)動(dòng)...
摘要:大家可以嘗試使用的,配置一個(gè)合適的勁度系數(shù)和空氣阻力。所做的事,只不過自己實(shí)現(xiàn)了一套緩動(dòng)函數(shù)。 根據(jù)經(jīng)典力學(xué)的觀點(diǎn),世界上所有的原子每時(shí)每刻仿佛都會(huì)根據(jù)當(dāng)前速度、受力和位置計(jì)算出下一刻的速度、受力和位置。上帝有一臺(tái)超級(jí)計(jì)算機(jī)嗎?非也,反而計(jì)算機(jī)是我們利用原子的這些特性拼裝出來的?,F(xiàn)在,我們卻要用計(jì)算機(jī),像上帝那樣,再造一個(gè)世界。 我不知道這個(gè)世界上有沒有仿世學(xué),但是既然動(dòng)畫是要模仿現(xiàn)實(shí)...
摘要:備注沒整理格式,抱歉動(dòng)畫實(shí)現(xiàn)的幾種方式性能排序?qū)崿F(xiàn)方式自身調(diào)用調(diào)用的定時(shí)器值推薦最小使用的原因即每秒幀為什么倒計(jì)時(shí)動(dòng)畫一定要用而避免使用兩者區(qū)別及引發(fā)的線程討論線程討論為什么單線程是的一大特性。 備注:沒整理格式,抱歉 動(dòng)畫實(shí)現(xiàn)的幾種方式:性能排序js < requestAnimationFrame 3->4->2. 那么在來看你這段代碼。 var t = true; window...
摘要:動(dòng)畫運(yùn)動(dòng)算法線性勻速運(yùn)動(dòng)效果二次方的緩動(dòng)三次方的緩動(dòng)四次方的緩動(dòng)五次方的緩動(dòng)正弦曲線的緩動(dòng)指數(shù)曲線的緩動(dòng)圓形曲線的緩動(dòng)指數(shù)衰減的正弦曲線緩動(dòng)超過范圍的三次方緩動(dòng)指數(shù)衰減的反彈緩動(dòng)。 requestAnimFrame兼容 window.requestAnimFrame = (function (callback,time) { return window.requestAnima...
摘要:方法接受兩個(gè)參數(shù)關(guān)鍵幀和持續(xù)時(shí)間。第一個(gè)參數(shù),關(guān)鍵幀,是一個(gè)對(duì)象數(shù)組,每個(gè)對(duì)象都是動(dòng)畫中的一個(gè)關(guān)鍵幀。為我們提供了兩種不同的方式設(shè)置緩動(dòng)在我們的關(guān)鍵幀數(shù)組或我們的選項(xiàng)對(duì)象內(nèi)。實(shí)際上,這些緩動(dòng)應(yīng)用在關(guān)鍵幀之間,而不是整個(gè)動(dòng)畫。 作者:Ollie Williams 原文:CSS Animations vs Web Animations API 在 JavaScript 有一個(gè)原生動(dòng)畫...
閱讀 3569·2021-09-10 10:51
閱讀 2552·2021-09-07 10:26
閱讀 2526·2021-09-03 10:41
閱讀 844·2019-08-30 15:56
閱讀 2935·2019-08-30 14:16
閱讀 3532·2019-08-30 13:53
閱讀 2140·2019-08-26 13:48
閱讀 1943·2019-08-26 13:37