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
Конфигурация анимации синхронизации.
Доступные свойства:
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 ,
},
});
Замечания Совместимость с платформами Ссылки