withTiming withTiming позволяет создать анимацию на основе длительности и easing .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 import React from 'react' ;
import { StyleSheet , View } from 'react-native' ;
import Animated , {
useSharedValue ,
useAnimatedStyle ,
withTiming ,
withRepeat ,
} from 'react-native-reanimated' ;
export default function App () {
const offset = useSharedValue ( 200 );
const animatedStyles = useAnimatedStyle (() => ({
transform : [{ translateX : offset . value }],
}));
React . useEffect (() => {
offset . value = withRepeat (
// highlight-next-line
withTiming ( - offset . value , { duration : 1500 }),
- 1 ,
true
);
}, []);
return (
< View style = { styles . container } >
< Animated . View
style = {[ styles . box , animatedStyles ]}
/>
< /View>
);
}
const styles = StyleSheet . create ({
container : {
flex : 1 ,
alignItems : 'center' ,
justifyContent : 'center' ,
height : '100%' ,
},
box : {
height : 120 ,
width : 120 ,
backgroundColor : '#b58df1' ,
borderRadius : 20 ,
},
});
Определение import { withTiming } from 'react-native-reanimated' ;
function App () {
sv . value = withTiming ( 0 );
// ...
}
Типизация
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 type AnimatableValue = number | string | number [];
interface WithTimingConfig {
duration? : number ;
easing? : EasingFunction ;
}
function withTiming < T extends AnimatableValue > (
toValue : T ,
config? : WithTimingConfig ,
callback ?: (
finished? : boolean ,
current? : AnimatableValue
) => void
) : T ;
Аргументы toValue Значение, при котором анимация придет в состояние покоя.
config Конфигурация анимации синхронизации.
Доступные свойства:
Имя Тип По-умолчанию Описание duration (опционально) number 300 Длина анимации (в миллисекундах). easing (опционально) Easing Easing.inOut(Easing.quad) Функция easing, определяющая кривую анимации.
Easing Параметр easing позволяет точно настроить анимацию на заданную длительность. Например, можно сделать так, чтобы анимация начиналась с быстрого ускорения, а затем замедлялась к концу, или начиналась медленно, затем набирала скорость и снова замедлялась к концу.
Все это становится понятным, если сравнить линейное ослабление с ослаблением по умолчанию Easing.inOut(Easing.quad).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 import React from 'react' ;
import { StyleSheet , View , Text } from 'react-native' ;
import Animated , {
useSharedValue ,
useAnimatedStyle ,
withTiming ,
Easing ,
withRepeat ,
} from 'react-native-reanimated' ;
const duration = 2000 ;
export default function App () {
const defaultAnim = useSharedValue ( 200 );
const linear = useSharedValue ( 200 );
const animatedDefault = useAnimatedStyle (() => ({
transform : [{ translateX : defaultAnim . value }],
}));
const animatedChanged = useAnimatedStyle (() => ({
transform : [{ translateX : linear . value }],
}));
React . useEffect (() => {
linear . value = withRepeat (
// highlight-next-line
withTiming ( - linear . value , {
duration ,
easing : Easing . linear ,
}),
- 1 ,
true
);
defaultAnim . value = withRepeat (
// highlight-next-line
withTiming ( - defaultAnim . value , {
duration ,
}),
- 1 ,
true
);
}, []);
return (
< View style = { styles . container } >
< Animated . View
style = {[ styles . box , animatedDefault ]}
>
< Text style = { styles . text } > inout < /Text>
< /Animated.View>
< Animated . View
style = {[ styles . box , animatedChanged ]}
>
< Text style = { styles . text } > linear < /Text>
< /Animated.View>
< /View>
);
}
const styles = StyleSheet . create ({
container : {
flex : 1 ,
alignItems : 'center' ,
justifyContent : 'center' ,
height : '100%' ,
},
box : {
height : 80 ,
width : 80 ,
margin : 20 ,
borderWidth : 1 ,
borderColor : '#b58df1' ,
borderRadius : 20 ,
alignItems : 'center' ,
justifyContent : 'center' ,
},
text : {
color : '#b58df1' ,
textTransform : 'uppercase' ,
fontWeight : 'bold' ,
},
});
Reanimated предоставляет набор готовых к использованию функций смягчения в модуле Easing. Визуализацию некоторых распространенных функций смягчения можно найти на сайте http://easings.net/ .
Вы можете использовать наши встроенные функции смягчения, передавая их в качестве свойства easing в конфигурацию withTiming:
import { Easing } from 'react-native-reanimated' ;
withTiming ( sv . value , {
easing : Easing . bounce ,
});
Доступные функции:
back обеспечивает простую анимацию, при которой объект перед движением вперед немного отходит назад. bezier(x1: number, y1: number, x2: number, y2: number) обеспечивает создание кубической кривой Безье bounce обеспечивает анимацию подпрыгивания circle предоставляет круговую функцию cubic - кубическая функция ease обеспечивает простую инерционную анимацию elastic(bounciness?: number) обеспечивает простое пружинное взаимодействие exp предоставляет экспоненциальную функцию linear обеспечивает линейную функцию poly(n: number) может быть использована для реализации квартовых, квинтовых и других функций высших степеней quad - квадратичная функция sin - синусоидальная функция Следующие помощники используются для модификации других функций easing.
in(easing: EasingFunction) запускает функцию ослабления вперед inOut(easing: EasingFunction) делает любую смягчающую функцию симметричной out(easing: EasingFunction) запускает функцию ослабления в обратном направлении callback Функция, вызываемая по завершении анимации. Если анимация отменена, то в качестве аргумента обратного вызова будет получено false, в противном случае - true.
Возвращает withTiming возвращает объект анимации . Он может быть либо напрямую присвоен shared value , либо использован в качестве значения для объекта стиля, возвращаемого из useAnimatedStyle .
Пример 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103 import React from 'react' ;
import {
StyleSheet ,
View ,
Text ,
Pressable ,
} from 'react-native' ;
import Animated , {
useSharedValue ,
useAnimatedStyle ,
withTiming ,
} from 'react-native-reanimated' ;
const TAB_WIDTH = 150 ;
const TABS = [ 'Home' , 'Search' , 'Profile' ];
export default function App () {
const offset = useSharedValue ( - TAB_WIDTH );
const animatedStyles = useAnimatedStyle (() => ({
transform : [{ translateX : offset . value }],
}));
const handlePress = ( tab ) => {
const newOffset = (() => {
switch ( tab ) {
case 'Home' :
return - TAB_WIDTH ;
case 'Search' :
return 0 ;
case 'Profile' :
return TAB_WIDTH ;
default :
return - TAB_WIDTH ;
}
})();
offset . value = withTiming ( newOffset );
};
return (
< View style = { styles . container } >
< View style = { styles . tabs } >
{ TABS . map (( tab , i ) => (
< Pressable
key = { tab }
style = {
i !== TABS . length - 1
? [
styles . tab ,
styles . divider ,
]
: styles . tab
}
onPress = {() => handlePress ( tab )}
>
< Text style = { styles . tabLabel } >
{ tab }
< /Text>
< /Pressable>
))}
< /View>
< Animated . View
style = {[
styles . animatedBorder ,
animatedStyles ,
]}
/>
< /View>
);
}
const styles = StyleSheet . create ({
container : {
flex : 1 ,
alignItems : 'center' ,
justifyContent : 'center' ,
height : '100%' ,
},
tabs : {
flexDirection : 'row' ,
},
tab : {
paddingHorizontal : 20 ,
paddingVertical : 10 ,
width : TAB_WIDTH ,
},
tabLabel : {
fontSize : 20 ,
textAlign : 'center' ,
fontWeight : 'bold' ,
},
divider : {
borderRightWidth : 1 ,
borderRightColor : '#ddd' ,
},
animatedBorder : {
height : 8 ,
width : 64 ,
backgroundColor : 'tomato' ,
borderRadius : 20 ,
},
});
Замечания Совместимость с платформами Ссылки