🔔 Alert..!! Get 2 Month Free Cloud Hosting With $200 Bonus From Digital Ocean ACTIVATE DEAL

A simple react native component to make an expanding circle transition.

Animation React Native

Documentation

react-native-expanding-circle-transition

contributions welcome Standard - JavaScript Style Guide npm version npm

Preview

App preview

Installation

npm install react-native-expanding-circle-transition --save

Props

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

How to use

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).

Usage exemples

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 Exemples 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

You May Also Like