forked from narendrashetty/onboarding-RN
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CircleTransition.js
90 lines (76 loc) · 1.85 KB
/
CircleTransition.js
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
import React, { Component, PropTypes } from 'react';
import { Easing, Modal, Dimensions, Animated } from 'react-native';
const { width, height } = Dimensions.get('window');
class CircleTransition extends Component {
constructor (props) {
super(props);
this.state = {
scale: new Animated.Value(0),
color: '#ccc'
};
}
start(color, callback) {
this.setState({
color: color
}, () => {
this.animate(callback);
});
}
animate(callback) {
Animated.timing(this.state.scale, {
toValue: 4,
duration: this.props.duration,
easing: this.props.easing
}).start(() => {
callback();
this.hideCircle();
});
}
hideCircle () {
this.setState({
scale: new Animated.Value(0)
});
}
getLeftPosition () {
const halfSize = this.props.size / 2;
const halfWidth = width / 2;
let marginHorizontalTopLeft = -halfSize;
return marginHorizontalTopLeft + halfWidth;
}
getTopPosition () {
const halfSize = this.props.size / 2;
let marginVerticalTopLeft = -halfSize;
return marginVerticalTopLeft + height;
}
render () {
const {scale, color} = this.state;
const { size } = this.props;
let topPosition = this.getTopPosition();
let leftPosition = this.getLeftPosition();
return (
<Animated.View style={{
position: 'absolute',
backgroundColor: color,
top: topPosition,
left: leftPosition,
width: size,
height: size,
borderRadius: size / 2,
transform: [{
scale: scale
}]
}} />
)
}
}
CircleTransition.propTypes = {
size: PropTypes.number,
duration: PropTypes.number,
easing: PropTypes.func,
}
CircleTransition.defaultProps = {
size: Math.min(width, height) - 1,
duration: 400,
easing: Easing.linear
}
export default CircleTransition;