「只要功夫深 不用關鍵幀」之數字動畫的玩法

「只要功夫深 不用關鍵幀」將不定期更新一些AE表達式和腳本的奇技淫巧,希望能給大家帶來一些啟發。

用AE做一個數字從0增長到100的動畫,你會怎麼做?

方式一,也是最簡單高效的辦法:

新建一個純色層,選擇菜單欄的 效果(Effect) -> 文本(Text) -> 編號(Numbers)

簡單設置好後,對數值打關鍵幀就可以了,可以設置字體、格式、小數位數等參數。

這種方式優點是簡單方便實用,不足就是不能設置一些自定義格式,比如表示百分數時後面加個「%」就得新建一層。

如果有這種需求,可以試試方法二:

新建一個文本圖層,對它添加一個滑塊控制

[效果(Effect) -> 表達式控制(Expression Control) -> 滑塊(Slider Control)]

然後點開文本圖層的 文本(Text) -> 源文本(Source Text), 按住alt鍵(windows下為alt,mac下為option)單擊小秒錶圖標開啟表達式,然後把表達式鏈接到之前添加的滑塊控制。

這時我們就可以通過對滑塊控制k幀來改變數值了,字體、排版這些都按文本圖層的規則來,足夠靈活。

(圖不動戳:raw.githubusercontent.com)

這裡需要注意的是,因為沒有限制小數位數,倆關鍵幀中間的數值可能會出現超長的小數宛如亂碼,因此需要加個取整或者指定小數位數的函數。

Math.floor()是向下取整,Math.round()是四捨五入,Math.ceil()是向上取整。如果需要保留小數,可以使用 Number(原值).toFixed(小數位數)。

此時,如果我們想表示百分數,只需加一行 `value + "%";` 就好了。

(圖不動戳:raw.githubusercontent.com

那麼問題來了,你不是說「只要功夫深,不用關鍵幀」么,這不還是用了?

OK,我們看看方法三:

首先,AE里圖層是可以打上時間標記的(詳見:After Effects 中的圖層標記和合成標記),

我們通過表達式就可以把圖層標記當做關鍵幀來用,嘿嘿。

同樣是新建一個文本圖層,我們給它在不同時間打倆時間標記(windows:alt + *,mac:Option + *),然後對源文本屬性粘貼如下表達式:

//獲取兩個標記的時間nvar t1 = marker.key(1).time;nvar t2 = marker.key(2).time;n//設置條件,當時間小於等於標記1時文本顯示「0 %」,大於等於標記2時顯示「100 5」n//當時間在倆標記中間時做一個數值映射,將這個時間區間映射到(0,100)內nif(time > t1 && time< t2){n //時間映射函數,詳見:n //https://helpx.adobe.com/cn/after-effects/using/expression-language-reference.html#interpolation_methods_expression_referencen var m = ease(time,t1,t2,0,100);n //對映射結果取整,Math.floor()是向下取整,Math.round()是四捨五入,Math.ceil()是向上取整n var v = Math.floor(m);n value = v + " %";n}else if(time<=t1){n value = 0 + " %";n}else value = 100 + " %";n

這時我們就可以通過移動時間標記來控制百分比的變化了,某些情況下還是挺方便的。

我簡單寫了個腳本直接添加一個「百分比」圖層:

var ly = app.project.activeItem.layers.addText("數字變化"); //在當前合成添加一個文字層nvar t = app.project.activeItem.time;//獲取當前時間軸位置nvar tDuration = 1;//初始時間間隔,生成後可以通過移動圖層標記來改變n//設置一個變數存儲表達式nvar exp = //獲取兩個標記的時間n + n var t1 = marker.key(1).time;n + n var t2 = marker.key(2).time;n + n //設置條件,當時間小於等於標記1時文本顯示「0 %」,大於等於標記2時顯示「100 %」n + n //當時間在倆標記中間時做一個數值映射,將這個時間區間映射到(0,100)內n + n if(time > t1 && time< t2){n + n //時間映射函數,詳見:n + n //After Effects 中的表達式語言n + n var m = ease(time,t1,t2,0,100);n + n //對映射結果取整,Math.floor()是向下取整,Math.round()是四捨五入,Math.ceil()是向上取整n + n var v = Math.floor(m);n + n value = v + " %";n + n }else if(time<=t1){n + n value = 0 + " %";n + n }else value = 100 + " %";;n//創建2個標記nvar p1= new MarkerValue("0%");nvar p2= new MarkerValue("100%");n//將標記放到文本圖層上nly.marker.setValueAtTime(t,p1);nly.marker.setValueAtTime(t+tDuration,p2);n//最後,把剛才的表達式塞給文本圖層的「源文本」屬性里,大功告成~nly.property("ADBE Text Properties")("ADBE Text Document").expression = exp;n

複製以上代碼到記事本等文本編輯器,另存為一個.jsx文件,然後通過 文件 -> 腳本 ->運行腳本文件 來運行這個腳本,就會在當前打開的合成中自動添加。

(腳本也可以點這裡右鍵另存)

效果如下:

(圖不動戳:raw.githubusercontent.com

另外,方法二方法三由於是基於文本圖層的,我們可以應用文本圖層的動畫,極大的擴展了表現力。不說別的,AE自帶的文字動畫預設就很豐富。這是方法一做不到的。

(圖不動戳:raw.githubusercontent.com


推薦閱讀:

[Framer] 添加 SVG 圖層,讓工程師追著打的效果成為現實
那些創意十足的Loading動效原型合集(一鍵復用!)
針對不同設計階段,如何選擇合適的動效工具?
用PS十倍無損壓縮GIF動效圖

TAG:交互动效 | AdobeAfterEffects | 动态图形设计 |