mirror of
https://github.com/bartgryszko/react-native-circular-progress.git
synced 2026-01-18 16:13:10 +00:00
69 lines
1.6 KiB
JavaScript
69 lines
1.6 KiB
JavaScript
import React from 'react';
|
|
import PropTypes from 'prop-types';
|
|
import { Animated, AppState, Easing, View, ViewPropTypes } from 'react-native';
|
|
import CircularProgress from './CircularProgress';
|
|
const AnimatedProgress = Animated.createAnimatedComponent(CircularProgress);
|
|
|
|
export default class AnimatedCircularProgress extends React.PureComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
fillAnimation: new Animated.Value(props.prefill),
|
|
};
|
|
}
|
|
|
|
componentDidMount() {
|
|
this.animate();
|
|
}
|
|
|
|
componentDidUpdate(prevProps) {
|
|
if (prevProps.fill !== this.props.fill) {
|
|
this.animate();
|
|
}
|
|
}
|
|
|
|
reAnimate(prefill, toVal, dur, ease) {
|
|
this.setState(
|
|
{
|
|
fillAnimation: new Animated.Value(prefill),
|
|
},
|
|
() => this.animate(toVal, dur, ease)
|
|
);
|
|
}
|
|
|
|
animate(toVal, dur, ease) {
|
|
const toValue = toVal >= 0 ? toVal : this.props.fill;
|
|
const duration = dur || this.props.duration;
|
|
const easing = ease || this.props.easing;
|
|
|
|
const anim = Animated.timing(this.state.fillAnimation, {
|
|
toValue,
|
|
easing,
|
|
duration,
|
|
});
|
|
anim.start(this.props.onAnimationComplete);
|
|
|
|
return anim;
|
|
}
|
|
|
|
render() {
|
|
const { fill, prefill, ...other } = this.props;
|
|
|
|
return <AnimatedProgress {...other} fill={this.state.fillAnimation} />;
|
|
}
|
|
}
|
|
|
|
AnimatedCircularProgress.propTypes = {
|
|
...CircularProgress.propTypes,
|
|
prefill: PropTypes.number,
|
|
duration: PropTypes.number,
|
|
easing: PropTypes.func,
|
|
onAnimationComplete: PropTypes.func,
|
|
};
|
|
|
|
AnimatedCircularProgress.defaultProps = {
|
|
duration: 500,
|
|
easing: Easing.out(Easing.ease),
|
|
prefill: 0,
|
|
};
|