react-native-typing-animation
Version:
A React Native typing animation for your chat app based on simple trigonometry to create better loaders.
71 lines (60 loc) • 2.03 kB
JavaScript
import React from "react";
import { View } from "react-native";
import PropTypes from 'prop-types';
import Dot from "./Dot";
import styles from "./styles";
class TypingAnimation extends React.Component {
constructor(props) {
super(props);
const { dotAmplitude, dotSpeed, dotY } = props;
this.state = {
currentAnimationTime: 0
};
this._animation = () => {
this.setState(prevState => ({
y1: dotY + dotAmplitude * Math.sin(prevState.currentAnimationTime),
y2: dotY + dotAmplitude * Math.sin(prevState.currentAnimationTime - 1),
y3: dotY + dotAmplitude * Math.sin(prevState.currentAnimationTime - 2),
currentAnimationTime: prevState.currentAnimationTime + dotSpeed
}));
this.frameAnimationRequest = requestAnimationFrame(this._animation);
};
this.frameAnimationRequest = requestAnimationFrame(this._animation);
}
componentWillUnmount() {
cancelAnimationFrame(this.frameAnimationRequest);
}
render() {
const { dotStyles, style, dotColor, dotMargin, dotRadius, dotX } = this.props;
return (
<View style={[styles.container, style]}>
<Dot x={dotX - dotRadius - dotMargin} y={this.state.y1} radius={dotRadius} style={dotStyles} dotColor={dotColor} />
<Dot x={dotX} y={this.state.y2} radius={dotRadius} style={dotStyles} dotColor={dotColor} />
<Dot x={dotX + dotRadius + dotMargin} y={this.state.y3} radius={dotRadius} style={dotStyles} dotColor={dotColor} />
</View>
);
}
}
TypingAnimation.defaultProps = {
style: {},
dotStyles: {},
dotColor: "black",
dotMargin: 3,
dotAmplitude: 3,
dotSpeed: 0.15,
dotRadius: 2.5,
dotY: 6,
dotX: 12
};
TypingAnimation.propTypes = {
style: PropTypes.object,
dotStyles: PropTypes.object,
dotColor: PropTypes.string,
dotMargin: PropTypes.number,
dotAmplitude: PropTypes.number,
dotSpeed: PropTypes.number,
dotRadius: PropTypes.number,
dotY: PropTypes.number,
dotX: PropTypes.number
};
export default TypingAnimation;