react-native-web-circular-progress
Version:
React Native cross-platform component for creating animated, circular progress with ReactART
76 lines (65 loc) • 2.11 kB
JavaScript
import React from 'react';
import PropTypes from 'prop-types';
import { View, Platform, ART } from 'react-native';
import MetricsPath from 'art/metrics/path';
const { Surface, Shape, Path, Group } = ART;
export default class CircularProgress extends React.Component {
circlePath(cx, cy, r, startDegree, endDegree) {
let endDegreeInRadians = (endDegree * Math.PI) / 180;
let p = Path();
p.move(cx + r, cy);
p.arc(-r + r * Math.cos(endDegreeInRadians), r * Math.sin(endDegreeInRadians), r, r, endDegree >= 180);
return p;
}
extractFill(fill) {
if (fill < 0.01) {
return 0;
} else if (fill > 100) {
return 100;
}
return fill;
}
render() {
const { size, width, tintColor, backgroundColor, style, rotation, linecap, children } = this.props;
const backgroundPath = this.circlePath(size / 2, size / 2, size / 2 - width / 2, 0, 360 * .9999);
const fill = this.extractFill(this.props.fill);
const circlePath = this.circlePath(size / 2, size / 2, size / 2 - width / 2, 0, (360 * .9999) * fill / 100);
return (
<View style={style}>
<Surface
width={size}
height={size}>
<Group rotation={rotation - 90} originX={size/2} originY={size/2}>
<Shape d={backgroundPath}
stroke={backgroundColor}
strokeWidth={width}/>
<Shape d={circlePath}
stroke={tintColor}
strokeWidth={width}
strokeCap={linecap}/>
</Group>
</Surface>
{
children && children(fill)
}
</View>
)
}
}
CircularProgress.propTypes = {
style: View.propTypes.style,
size: PropTypes.number.isRequired,
fill: PropTypes.number.isRequired,
width: PropTypes.number.isRequired,
tintColor: PropTypes.string,
backgroundColor: PropTypes.string,
rotation: PropTypes.number,
linecap: PropTypes.string,
children: PropTypes.func
}
CircularProgress.defaultProps = {
tintColor: 'black',
backgroundColor: '#e4e4e4',
rotation: 90,
linecap: 'butt'
}