react-native-progress and react-native-svg serve different layers of the graphics stack in React Native development. react-native-svg is a low-level library that brings SVG support to React Native, allowing developers to render vector graphics like circles, paths, and rects using native components. react-native-progress is a higher-level UI component library that provides ready-to-use progress indicators (bars, circles, pies) and often relies on react-native-svg to render its SVG-based components. While one provides the building blocks for vector art, the other offers pre-built solutions for common loading states.
When building mobile apps with React Native, displaying progress or vector graphics is a common requirement. Developers often encounter react-native-progress and react-native-svg and wonder how they fit together. While they both deal with graphics, they solve different problems. One offers ready-made UI components, while the other provides the low-level primitives to draw vectors. Let's explore how they differ and when to use each.
react-native-svg gives you the raw tools to draw vector graphics.
<Svg>, <Circle>, <Rect>, and <Path>.// react-native-svg: Drawing a circle manually
import { Svg, Circle } from 'react-native-svg';
<Svg width="100" height="100">
<Circle
cx="50"
cy="50"
r="40"
stroke="blue"
strokeWidth="5"
fill="transparent"
/>
</Svg>
react-native-progress gives you finished UI components.
<ProgressBar>, <Circle>, and <Pie>.progress value (0 to 1), and it handles the drawing logic.// react-native-progress: Using a pre-built circle
import { Circle } from 'react-native-progress';
<Circle
size={100}
progress={0.5}
color="blue"
thickness={5}
/>
react-native-svg allows unlimited customization.
// react-native-svg: Custom gradient and shape
import { Svg, Defs, LinearGradient, Stop, Rect } from 'react-native-svg';
<Svg width="100" height="100">
<Defs>
<LinearGradient id="grad" x1="0" y1="0" x2="1" y2="1">
<Stop offset="0" stopColor="red" />
<Stop offset="1" stopColor="blue" />
</LinearGradient>
</Defs>
<Rect width="100" height="100" fill="url(#grad)" />
</Svg>
react-native-progress limits you to its supported types.
// react-native-progress: Customizing colors and size
import { Bar } from 'react-native-progress';
<Bar
progress={0.7}
width={200}
color="#3498db"
unfilledColor="#ecf0f1"
borderWidth={0}
/>
react-native-svg is a native module.
# Installation for react-native-svg
npm install react-native-svg
# iOS specific
cd ios && pod install
react-native-progress is mostly JavaScript but relies on SVG.
Circle and Pie) depend on react-native-svg.# Installation for react-native-progress
npm install react-native-progress react-native-svg
# iOS specific
cd ios && pod install
react-native-svg requires manual animation logic.
react-native-reanimated or the Animated API to animate props.// react-native-svg: Manual animation setup
import { Animated } from 'react-native';
import { Svg, Circle } from 'react-native-svg';
const animatedProgress = new Animated.Value(0);
Animated.timing(animatedProgress, { toValue: 1, duration: 1000 }).start();
const strokeDashoffset = animatedProgress.interpolate({
inputRange: [0, 1],
outputRange: [251, 0] // Circumference calculation
});
<Svg>
<Circle
strokeDasharray={251}
strokeDashoffset={strokeDashoffset}
// ...other props
/>
</Svg>
react-native-progress includes built-in animation props.
animated or use the indeterminate prop for spinning loaders.// react-native-progress: Built-in indeterminate animation
import { Circle } from 'react-native-progress';
<Circle
size={50}
indeterminate={true}
color="#e74c3c"
/>
You need a simple bar to show upload percentage.
react-native-progress<Bar> component that works instantly with a progress prop.import { Bar } from 'react-native-progress';
<Bar progress={uploadPercentage} width={null} />
You need to draw a complex radar chart for user stats.
react-native-svgimport { Svg, Polygon } from 'react-native-svg';
<Svg><Polygon points="50,5 95,50 50,95 5,50" fill="green" /></Svg>
Your design team created a unique, non-circular loading animation.
react-native-svgimport { Svg, Path } from 'react-native-svg';
<Svg><Path d="M10 10 H 90 V 90 H 10 L 10 10" stroke="black" fill="transparent" /></Svg>
You need to show loading states in a proof-of-concept app.
react-native-progressimport { Pie } from 'react-native-progress';
<Pie progress={0.3} size={100} />
| Feature | react-native-progress | react-native-svg |
|---|---|---|
| Abstraction Level | High (UI Components) | Low (Graphics Primitives) |
| Setup Effort | Low (Install + Import) | Medium (Install + Native Config) |
| Flexibility | Limited to preset shapes | Unlimited (Full SVG Spec) |
| Animation | Built-in props | Manual (Animated/Reanimated) |
| Dependency | Depends on react-native-svg | Standalone Native Module |
| Use Case | Loaders, Progress Bars | Charts, Icons, Custom Graphics |
It is important to note that these packages are not mutually exclusive. In fact, they often work in tandem. react-native-progress uses react-native-svg internally for components like Circle and Pie. If you use react-native-progress, you are implicitly using react-native-svg.
// Under the hood, react-native-progress Circle looks something like this:
// (Simplified conceptual example)
import { Svg, Circle } from 'react-native-svg';
// react-native-progress abstracts this complexity:
export const Circle = ({ progress, ...props }) => (
<Svg>
<Circle
strokeDasharray={calculateDash(progress)}
{...props}
/>
</Svg>
);
react-native-progress is like a furniture store šŖ ā you buy a chair that is already assembled. It looks good, works immediately, and fits standard needs. Ideal for standard loaders and progress bars where speed of development is key.
react-native-svg is like a woodworking shop šŖ ā you get the wood and tools to build anything. It requires more skill and time, but you can build a chair, a table, or a sculpture. Ideal for custom graphics, charts, and unique designs.
Final Thought: For most standard progress indicators, start with react-native-progress. If you hit its limits or need custom data viz, drop down to react-native-svg. And remember ā if you use the former, you will likely need to install the latter anyway.
Choose react-native-progress if you need standard, pre-built progress indicators like linear bars, circular loaders, or pie charts without writing custom SVG logic. It saves development time by offering a consistent API for common loading states and handles animation props out of the box. This package is ideal for forms, upload screens, or any scenario where a conventional progress UI is sufficient. Note that using its SVG-based components will still require react-native-svg as a peer dependency.
Choose react-native-svg if you need full control over vector graphics, custom data visualizations, or non-standard progress indicators that pre-built libraries cannot support. It provides the primitive components like <Circle>, <Path>, and <G> necessary to draw anything from icons to complex charts. This is the foundational choice for teams building a custom design system or requiring specific graphical interactions. It is also required if you plan to use the SVG-based components within react-native-progress.
Progress indicators and spinners for React Native using React Native SVG.

$ npm install react-native-progress --save
To use the Pie or Circle components, you need to install React Native SVG in your project.
Note: If you don't want the React Native SVG based components and it's dependencies, do a deep require instead: import ProgressBar from 'react-native-progress/Bar';.
import * as Progress from 'react-native-progress';
<Progress.Bar progress={0.3} width={200} />
<Progress.Pie progress={0.4} size={50} />
<Progress.Circle size={30} indeterminate={true} />
<Progress.CircleSnail color={['red', 'green', 'blue']} />
| Prop | Description | Default |
|---|---|---|
animated | Whether or not to animate changes to progress. | true |
indeterminate | If set to true, the indicator will spin and progress prop will be ignored. | false |
indeterminateAnimationDuration | Sets animation duration in milliseconds when indeterminate is set. | 1000 |
progress | Progress of whatever the indicator is indicating. A number between 0 and 1. | 0 |
color | Fill color of the indicator. | rgba(0, 122, 255, 1) |
unfilledColor | Color of the remaining progress. | None |
borderWidth | Width of outer border, set to 0 to remove. | 1 |
borderColor | Color of outer border. | color |
Progress.BarAll of the props under Properties in addition to the following:
| Prop | Description | Default |
|---|---|---|
width | Full width of the progress bar, set to null to use automatic flexbox sizing. | 150 |
height | Height of the progress bar. | 6 |
borderRadius | Rounding of corners, set to 0 to disable. | 4 |
useNativeDriver | Use native driver for the animations. | false |
animationConfig | Config that is passed into the Animated function. | { bounciness: 0 } |
animationType | Animation type to animate the progress, one of: decay, timing, spring. | spring |
Progress.CircleAll of the props under Properties in addition to the following:
| Prop | Description | Default |
|---|---|---|
size | Diameter of the circle. | 40 |
endAngle | Determines the endAngle of the circle. A number between 0 and 1. The final endAngle would be the number multiplied by 2Ļ | 0.9 |
thickness | Thickness of the inner circle. | 3 |
showsText | Whether or not to show a text representation of current progress. | false |
formatText(progress) | A function returning a string to be displayed for the textual representation. | See source |
textStyle | Styles for progress text, defaults to a same color as circle and fontSize proportional to size prop. | None |
allowFontScaling | Whether or not to respect device font scale setting. | true |
direction | Direction of the circle clockwise or counter-clockwise. | clockwise |
strokeCap | Stroke Cap style for the circle butt, square or round. | butt |
fill | Fill color of the inner circle. | None (transparent) |
Progress.PieAll of the props under Properties in addition to the following:
| Prop | Description | Default |
|---|---|---|
size | Diameter of the pie. | 40 |
Progress.CircleSnail| Prop | Description | Default |
|---|---|---|
animating | If the circle should animate. | true |
hidesWhenStopped | If the circle should be removed when not animating. | false |
size | Diameter of the circle. | 40 |
color | Color of the circle, use an array of colors for rainbow effect. | rgba(0, 122, 255, 1) |
thickness | Thickness of the circle. | 3 |
duration | Duration of animation. | 1000 |
spinDuration | Duration of spin (orbit) animation. | 5000 |
strokeCap | Stroke Cap style for the circle butt, square or round. | round |
To Mandarin Drummond for giving me the NPM name.
MIT License. Ā© Joel Arvidsson 2015-