「只要功夫深 不用關鍵幀」之數字動畫的玩法
用AE做一個數字從0增長到100的動畫,你會怎麼做?
方式一,也是最簡單高效的辦法:
新建一個純色層,選擇菜單欄的 效果(Effect) -> 文本(Text) -> 編號(Numbers)簡單設置好後,對數值打關鍵幀就可以了,可以設置字體、格式、小數位數等參數。
這種方式優點是簡單方便實用,不足就是不能設置一些自定義格式,比如表示百分數時後面加個「%」就得新建一層。
如果有這種需求,可以試試方法二:
新建一個文本圖層,對它添加一個滑塊控制
[效果(Effect) -> 表達式控制(Expression Control) -> 滑塊(Slider Control)]
然後點開文本圖層的 文本(Text) -> 源文本(Source Text), 按住alt鍵(windows下為alt,mac下為option)單擊小秒錶圖標開啟表達式,然後把表達式鏈接到之前添加的滑塊控制。
這時我們就可以通過對滑塊控制k幀來改變數值了,字體、排版這些都按文本圖層的規則來,足夠靈活。
(圖不動戳:https://raw.githubusercontent.com/bigxixi/ReadMe-Resources/master/percentage/sliderForGif.gif)這裡需要注意的是,因為沒有限制小數位數,倆關鍵幀中間的數值可能會出現超長的小數宛如亂碼,因此需要加個取整或者指定小數位數的函數。
Math.floor()是向下取整,Math.round()是四捨五入,Math.ceil()是向上取整。如果需要保留小數,可以使用 Number(原值).toFixed(小數位數)。
此時,如果我們想表示百分數,只需加一行 `value + "%";` 就好了。
(圖不動戳:https://raw.githubusercontent.com/bigxixi/ReadMe-Resources/master/percentage/sliderFixedForGif.gif)那麼問題來了,你不是說「只要功夫深,不用關鍵幀」么,這不還是用了?
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文件,然後通過 文件 -> 腳本 ->運行腳本文件 來運行這個腳本,就會在當前打開的合成中自動添加。
(腳本也可以點這裡右鍵另存)
效果如下:
(圖不動戳:https://raw.githubusercontent.com/bigxixi/ReadMe-Resources/master/percentage/final_new.gif)另外,方法二和方法三由於是基於文本圖層的,我們可以應用文本圖層的動畫,極大的擴展了表現力。不說別的,AE自帶的文字動畫預設就很豐富。這是方法一做不到的。
(圖不動戳:https://raw.githubusercontent.com/bigxixi/ReadMe-Resources/master/percentage/animGif.gif)推薦閱讀:
※[Framer] 添加 SVG 圖層,讓工程師追著打的效果成為現實
※那些創意十足的Loading動效原型合集(一鍵復用!)
※針對不同設計階段,如何選擇合適的動效工具?
※用PS十倍無損壓縮GIF動效圖
TAG:交互动效 | AdobeAfterEffects | 动态图形设计 |