Fortschrittsbalken in React Native
Fortschrittsbalken
~9 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Auch für Fortschrittsbalken gibt es keine eingebaute, plattformübergreifende Komponente mehr in aktuellem React Native (das frühere ProgressBarAndroid/ProgressViewIOS wurden entfernt) – die gängige Lösung: ein View mit animierter Breite in Prozent.
1. Beschreibung
Ein Fortschrittsbalken besteht aus zwei verschachtelten Views: einem äußeren mit fester Breite (die "Spur") und einem inneren, dessen Breite (als Prozentsatz oder animierter Animated.Value) den aktuellen Fortschritt darstellt.
2. Kurzes Beispiel
<View style={{ height: 8, backgroundColor: '#e5e7eb', borderRadius: 4 }}>
<View style={{ width: `${fortschritt}%`, height: '100%', backgroundColor: '#2563eb', borderRadius: 4 }} />
</View>3. Komplettes Projekt: Datei-Upload-Simulation
npx create-expo-app progress-bar-demo
cd progress-bar-demoimport { useEffect, useRef } from 'react';
import { Animated, View, StyleSheet } from 'react-native';
function Fortschrittsbalken({ prozent }) {
const breite = useRef(new Animated.Value(0)).current;
useEffect(() => {
Animated.timing(breite, {
toValue: prozent,
duration: 300,
useNativeDriver: false, // width kann nicht mit dem Native Driver animiert werden
}).start();
}, [prozent]);
return (
<View style={styles.spur}>
<Animated.View
style={[
styles.fuellung,
{ width: breite.interpolate({ inputRange: [0, 100], outputRange: ['0%', '100%'] }) },
]}
/>
</View>
);
}
const styles = StyleSheet.create({
spur: { height: 10, backgroundColor: '#e5e7eb', borderRadius: 5, overflow: 'hidden' },
fuellung: { height: '100%', backgroundColor: '#2563eb', borderRadius: 5 },
});
export default Fortschrittsbalken;import { useState } from 'react';
import { View, Text, Button, StyleSheet } from 'react-native';
import Fortschrittsbalken from './components/Fortschrittsbalken';
export default function App() {
const [prozent, setProzent] = useState(0);
function hochladenSimulieren() {
setProzent(0);
const intervall = setInterval(() => {
setProzent((aktuell) => {
const naechster = aktuell + 10;
if (naechster >= 100) clearInterval(intervall);
return Math.min(naechster, 100);
});
}, 200);
}
return (
<View style={styles.container}>
<Text style={styles.label}>Upload: {prozent}%</Text>
<Fortschrittsbalken prozent={prozent} />
<View style={styles.button}>
<Button title="Upload starten" onPress={hochladenSimulieren} />
</View>
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, paddingTop: 80, paddingHorizontal: 24 },
label: { marginBottom: 8, fontSize: 16 },
button: { marginTop: 20 },
});4. Erklärung
useNativeDriver: falseist hier PFLICHT –widthist eine Layout-Eigenschaft, und der native Treiber unterstützt ausschließlichopacity/transform.breite.interpolate()übersetzt den numerischen Animated-Wert (0–100) in einen Prozent-STRING ('0%'–'100%'), dawidthim Style entweder eine Zahl (Pixel) oder einen Prozent-String erwartet.overflow: 'hidden'an der "Spur" schneidet die innere Füllung an den abgerundeten Ecken ab, statt eckig über den Rand hinauszuragen.setIntervalsimuliert hier einen echten Netzwerk-Upload-Fortschritt; in einer echten App käme der Prozentwert typischerweise aus demonUploadProgress-Callback einer HTTP-Bibliothek wie Axios (siehe Kapitel "Axios").