在移動客戶端開發中流暢、有意義的動畫是非常重要的,現實生活中的物體在開始移動和停下來的時候都具有一定的慣性,我們在介面中也可以使用動畫來實現契合物理規律的互動。
官方在開發RN的時候,提供了兩個互補的動畫系統:用於建立精細的互動控制的動畫Animated和用於全域性的佈局動畫LayoutAnimation。
本篇文章主要講Animated動畫庫的使用
執行一個動畫最基本的原理就是呼叫動畫函式改變一個變數值,而這個變數值繫結到控制元件的屬性上,比如透明的、位置等。通過動畫函式改變值從而使控制元件動起來。所以最基本的動畫要有2個屬性
- 變數值(Animated.Value和Animated.ValueXY)區別一個是單個值,一個是向量值(可以理解為二維座標值)
- 動畫型別:timing、spring、decay
先簡單看個例子
```
const App = () => {
const scaleAnim = useRef(new Animated.Value(0)).current;
const fadeIn = () => {
// Will change fadeAnim value to 1 in 2 seconds
Animated.timing(scaleAnim, {
toValue: 1,
duration: 2000,
}).start();
};
const fadeOut = () => {
// Will change fadeAnim value to 0 in 2 seconds
Animated.timing(scaleAnim, {
toValue: 0,
duration: 2000,
}).start();
};
return (
bounciness?: number, // 控制彈性,預設8。
speed?: number, // 控制動畫的速度。預設12。
tension?: number, // 張力,預設40
friction?: number, // 摩擦力,預設為7.
stiffness?: number, // 彈簧剛度係數,預設100。
damping?: number, // 定義了由於摩擦力如何阻尼彈簧的運動,預設10。
mass?: number, // 物體的質量附著在彈簧的末端,預設1。
};
不能同時定義 bounciness/speed、tension/friction 或 stiffness/damping/mass 這三組資料,只能指定其中一組,即三選一
```
3. Animated.timing()使用easing 函式讓數值隨時間動起來。
export type TimingAnimationConfigSingle = AnimationConfig & {
toValue: number | AnimatedValue, //
easing?: (value: number) => number, // 緩動函式。 預設為Easing.inOut(Easing.ease)。
duration?: number, // 動畫的持續時間(毫秒)。預設值為 500.
delay?: number, // 開始動畫前的延遲時間(毫秒)。預設為 0.
};
以上三個都有兩個共同的不常用的引數: isInteraction: 指定本動畫是否在InteractionManager的佇列中註冊以影響其任務排程。預設值為 true。 useNativeDriver: 啟用原生動畫驅動。預設不啟用(false)。
注意⚠️:啟動原生動畫驅動時,位移translateX這種動畫屬性時不能與其他動畫屬性一起使用。安卓機上會有問題
組合動畫
parallel
(同時執行)、sequence
(順序執行)、delay(延時執行)
、``
1、使用sequence
可以把多個動畫組織起來,讓他們依次順序執行。
動畫1 -> 動畫2 -> 動畫3 ->動畫4 -> 動畫5
例子中有兩個動畫。一個控制透明度,另一個移動一定距離
```
const App = () => {
const fadeAnim = useRef(new Animated.Value(0)).current;
const translateAnim = useRef(new Animated.Value(0)).current;
const fadeIn = () => {
Animated.parallel([
Animated.timing(fadeAnim, {
toValue: 1,
duration: 1000
}),
Animated.timing(translateAnim, {
toValue: 50,
duration: 1000
}),
]).start();
};
return (