npm install react-native-expanding-circle-transition --save
Props | type | description | required or default |
---|---|---|---|
color | string | Color of the circle view | 'orange' |
size | number | Size of the circle view. Important: It has to fit in the window | Math.min(width, height) - 1 |
scaleShrink | number | Scale factor to shrink the circle | 0 |
scaleExpand | number | Scale factor to expand the circle | 4 |
transitionBuffer | number | Buffer between the transition and the animation. The transition must happen before the circle is hidden | 5 |
duration | number | Animation duration | 800 |
expand | bool | Expand the circle if true, reduce the circle if false | true |
position | enum | Circle position : ['topLeft', 'topRight', 'bottomLeft', 'bottomRight', 'center', 'left', 'right', 'top', 'bottom', 'custom'] | 'topLeft' |
customLeftMargin | number | Custom position's left margin from the center of the circle positioned at topLeft | 0 |
customTopMargin | number | Custom position's top margin from the center of the circle positioned at topLeft | 0 |
easing | func | React Native Animation Easing | Easing.linear |
To trigger the animation, you need to use a ref to call the start function of this component. To change the scene before the circle is hidden, pass a callback(check out usage exemple handlePress function).
import React, { Component } from "react";
import {
Easing,
StyleSheet,
Text,
View,
TouchableWithoutFeedback,
} from "react-native";
import CircleTransition from "react-native-expanding-circle-transition";
const ANIMATION_DURATION = 1200;
const INITIAL_VIEW_BACKGROUND_COLOR = "#E3E4E5";
const CIRCLE_COLOR1 = "#29C5DB";
const CIRCLE_COLOR2 = "#4EB8AE";
const CIRCLE_COLOR3 = "#81C781";
const CIRCLE_COLOR4 = "#B0D882";
const TRANSITION_BUFFER = 10;
const POSITON = "custom";
const reactMixin = require("react-mixin");
import TimerMixin from "react-timer-mixin";
class Examples extends Component {
constructor(props) {
super(props);
this.state = {
viewBackgroundColor: INITIAL_VIEW_BACKGROUND_COLOR,
circleColor: CIRCLE_COLOR1,
customLeftMargin: 0,
customTopMargin: 0,
counter: 0,
};
this.handlePress = this.handlePress.bind(this);
this.changeColor = this.changeColor.bind(this);
}
handlePress(event) {
let pressLocationX = event.nativeEvent.locationX;
let pressLocationY = event.nativeEvent.locationY;
this.setState(
{
customLeftMargin: pressLocationX,
customTopMargin: pressLocationY,
},
this.circleTransition.start(this.changeColor)
);
}
changeColor() {
const { circleColor, counter } = this.state;
let newCounter = counter < 3 ? counter + 1 : 0;
let newCircleColor = this.getColor(newCounter);
this.setState({
viewBackgroundColor: circleColor,
counter: newCounter,
});
this.changeCircleColor(newCircleColor);
}
changeCircleColor(newCircleColor) {
this.setTimeout(() => {
this.setState({
circleColor: newCircleColor,
});
}, TRANSITION_BUFFER + 5);
}
getColor(counter) {
switch (counter) {
case 0:
return CIRCLE_COLOR1;
case 1:
return CIRCLE_COLOR2;
case 2:
return CIRCLE_COLOR3;
case 3:
return CIRCLE_COLOR4;
default:
return CIRCLE_COLOR4;
}
}
render() {
let {
circleColor,
viewBackgroundColor,
customTopMargin,
customLeftMargin,
} = this.state;
return (
<View
style={[
styles.container,
{
backgroundColor: viewBackgroundColor,
},
]}
>
<TouchableWithoutFeedback
style={styles.touchable}
onPress={this.handlePress}
>
<View style={styles.touchableView}>
<Text style={styles.text}>{viewBackgroundColor.toString()}</Text>
</View>
</TouchableWithoutFeedback>
<CircleTransition
ref={(circle) => {
this.circleTransition = circle;
}}
color={circleColor}
expand
customTopMargin={customTopMargin}
customLeftMargin={customLeftMargin}
transitionBuffer={TRANSITION_BUFFER}
duration={ANIMATION_DURATION}
easing={Easing.linear}
position={POSITON}
/>
</View>
);
}
}
reactMixin(Exemples.prototype, TimerMixin);
const styles = StyleSheet.create({
container: {
flex: 1,
flexDirection: "column",
justifyContent: "center",
alignItems: "stretch",
},
touchableView: {
flex: 1,
alignItems: "center",
justifyContent: "center",
},
text: {
fontSize: 45,
fontWeight: "400",
color: "#253039",
},
touchable: {
flex: 1,
flexDirection: "row",
alignItems: "center",
justifyContent: "center",
},
});
export default Exemples;