Vous avez probablement rencontré l'une des deux situations.
Vous avez soit un écran qui ressemble à un plateau et qui vous semble inachevé, et vous souhaitez un fond ou un bouton qui ressemble à un produit réel plutôt qu'à un squelette. Ou vous avez déjà essayé d'ajouter un gradient React Native, et maintenant vous êtes coincé dans un limbo de configuration car la moitié des exemples utilisent Expo et l'autre moitié suppose un projet natif bare.
C'est là que la plupart des tutoriels s'arrêtent d'être utiles. Le composant API est simple. Le choix de l'environnement n'est pas. colors prop et plus sur le fait que vous êtes dans un workflow géré par Expo ou que vous gérez vous-même les liens natifs, les pods et les mocks de test.
Tableau de Contenu
- Ce que les gradients font bien
- Choisir Votre Chemin Expo vs Installation Nativité Réact sans Framework
- Techniques de Gradient Fond pour les Éléments d'Interface
- Donner vie aux gradients avec des animations
- Performances, accessibilité et particularités de plateforme
- Résolution des problèmes et meilleures pratiques finales
Pourquoi votre application React Native a besoin de gradients
Un grand nombre d'interfaces utilisateur mobiles échouent pour la même raison. Le layout est correct, l'espace est correct, la typographie est acceptable, mais l'écran ressent toujours comme mort. Les remplissages solides font que tout ressemble à des placeholders à moins que le reste du système visuel ne fasse beaucoup de travail.
A un composant React Native de gradient linéaire fixe cela avec très peu de code. Il ajoute de la profondeur, crée une séparation entre les sections et donne aux éléments de haute priorité un poids visuel clair. Un bon fond de gradient peut rendre une page de connexion intentionnelle. Un bon bouton de gradient peut rendre l'action principale évidente sans recourir à des ombres lourdes ou des bordures trop bruyantes.
Par 2019, expo-linear-gradient et react-native-linear-gradient sont apparus dans plus de 42 % des projets React Native, which is a strong signal that gradients aren’t a niche effect anymore. They’re standard UI tooling in production apps, not decoration bolted on at the end, as noted in Adoption de gradient React Native.
Quels gradients réussissent
- Créer de la profondeur : Une écran avec un fond plat souvent semble inachevé. Un mélange subtil de haut en bas donne à la surface un sentiment de couches.
- Guidé l'attention : Les CTAs primaires, les cartes d'inscription et les en-têtes d'hero se démarquent sans ajouter de bruit visuel.
- Remplacer les actifs d'image : Dans de nombreux cas, un gradient vous donne un polissage sans envoyer d'images de fond supplémentaires.
Règle pratique : Use gradients where hierarchy matters. Backgrounds, hero cards, CTA surfaces, and media overlays benefit most. Form fields, dense lists, and body copy containers usually don’t.
Il y a aussi un angle de conception de produit ici. Les équipes travaillant sur plusieurs plateformes dépensent déjà du temps pour essayer de garder les interfaces cohérentes. Si cela fait partie de votre pile, ces pratiques UI et UX multiplateformes pour les applications mobiles s'alignent bien avec le même raisonnement : moins d'actifs, plus de surfaces réutilisables et des systèmes visuels qui tiennent la route sur plusieurs écrans.
Choisir votre chemin : Expo vs Réact Native sans les éléments de base
C'est cette branche qui cause le plus de douleur. La mise en page API ressemble presque à l'identique dans les deux bibliothèques, mais la configuration n'est pas.
Si vous êtes dans une application Expo gérée, utilisez expo-linear-gradientSi vous êtes dans une application React Native nue, utilisez react-native-linear-gradientN'essayez pas de brouiller les lignes à moins que vous sachiez exactement pourquoi vous le faites.

Expo setup
Expo est le chemin plus doux. L'installation est simple, la correspondance de version est gérée pour vous, et vous n'avez pas à vous soucier de la liaison native.
Installez-le comme ceci :
npx expo install expo-linear-gradient
Utilisez-le comme ceci :
import React from 'react';
import { StyleSheet, View, Text } from 'react-native';
import { LinearGradient } from 'expo-linear-gradient';
export default function App() {
return (
<LinearGradient
colors={['#0f172a', '#1d4ed8']}
style={styles.container}
>
<Text style={styles.text}>Hello gradient</Text>
</LinearGradient>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
text: {
color: '#fff',
fontSize: 24,
fontWeight: '700',
},
});
Expo est la bonne choix lorsque vous voulez un démarrage rapide, des paramètres sains et moins d'arêtes natives. C'est aussi pourquoi les équipes explorant des workflows Expo avancés finissent souvent par utiliser un Client de développement Expo pour capacités natives personnalisées seulement lorsque le chemin géré ne couvre plus les besoins de l'application.
Configuration React Native de base
React Native Bare donne un accès direct aux modules natifs, mais vous assumez les aspérités.
Installez le package :
npm install react-native-linear-gradient
Pour iOS, installez les pods :
cd ios && pod install
Utilisation de base :
import React from 'react';
import { StyleSheet, Text } from 'react-native';
import LinearGradient from 'react-native-linear-gradient';
export default function App() {
return (
<LinearGradient
colors={['#111827', '#7c3aed']}
style={styles.container}
>
<Text style={styles.text}>Hello gradient</Text>
</LinearGradient>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
text: {
color: '#fff',
fontSize: 24,
fontWeight: '700',
},
});
Où les projets de base se cassent généralement
La pièce manquante dans la plupart des tutoriels est la mise en œuvre de tests et la configuration native. ce résumé de discussion Stack Overflow, 68 % des threads Stack Overflow sur ce sujet en 2024 à 2025 impliquent des erreurs de modules natifs dans les configurations React Native de baseet la même source note des problèmes récurrents avec la simulation Jest et les conflits CocoaPods iOS.
Si vous utilisez Jest dans une application bare, ajoutez le mock explicitement :
// jest.setup.js
import mockRNLinearGradient from 'react-native-linear-gradient/jest/linear-gradient-mock';
jest.mock('react-native-linear-gradient', () => mockRNLinearGradient);
Et référez le fichier de configuration dans votre config Jest :
module.exports = {
preset: 'react-native',
setupFiles: ['<rootDir>/jest.setup.js'],
};
Bare React Native works well for gradients. It just doesn’t forgive incomplete setup. Most failures aren’t visual bugs. They’re linking, pods, or test environment issues.
Voici la table de décision pratique :
| Type de projet | Bibliothèque | Best fit |
|---|---|---|
| Application Expo gérée | expo-linear-gradient |
Chemins les plus rapides, moins de configuration |
| Application React Native nue | react-native-linear-gradient |
Contrôle natif complet |
| Application nue avec Jest | react-native-linear-gradient + mock |
Nécessaire pour maintenir les tests stables |
Techniques de Gradient Fond pour les Éléments d'Interface
Une approche courante consiste à utiliser le même petit ensemble de modèles de gradient à répéter sans cesse. Fond d'écran. Boutons. Titres. Si ces trois éléments sont solidaires, vous pouvez les réutiliser sur un grand nombre d'écrans.

Un modèle mental utile est celui-ci :
colorscontrôle la palettestartetenddirection de contrôlelocationscontrôles où se produisent les transitions
Si votre écran d'accueil ou d'entrée utilise un gradient, il s'intègre naturellement aux modèles plus larges de séquence de démarrage décrits dans cet article. Guide de l'écran de démarrage React Native.
guide de l'écran d'accueil React Native
C'est le modèle le plus simple et le plus réutilisable.
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { LinearGradient } from 'expo-linear-gradient';
// For bare RN, switch to:
// import LinearGradient from 'react-native-linear-gradient';
export default function WelcomeScreen() {
return (
<LinearGradient
colors={['#0f172a', '#1e293b', '#2563eb']}
start={{ x: 0, y: 0 }}
end={{ x: 1, y: 1 }}
style={styles.container}
>
<View style={styles.content}>
<Text style={styles.title}>Welcome back</Text>
<Text style={styles.subtitle}>Your workspace is ready.</Text>
</View>
</LinearGradient>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
content: {
flex: 1,
justifyContent: 'center',
paddingHorizontal: 24,
},
title: {
color: '#fff',
fontSize: 32,
fontWeight: '800',
marginBottom: 8,
},
subtitle: {
color: 'rgba(255,255,255,0.8)',
fontSize: 16,
},
});
A un mélange diagonal, on ressent généralement plus de dynamisme qu'à un vertical par défaut. C'est pourquoi start={{ x: 0, y: 0 }} et end={{ x: 1, y: 1 }} constituent un bon choix par défaut lorsque l'écran est principalement décoratif.
Ne choisissez pas les couleurs en isolation. Testez-les derrière du texte réel, des icônes et des styles de barre de statut. Un ensemble de couleurs qui ressemble bien dans Figma peut échouer instantanément dès que du contenu s'y trouve.
Les boutons de gradient qui fonctionnent toujours comme des boutons
L'erreur la plus courante ici est de mettre le comportement tactile directement sur le gradient et d'oublier l'état désactivé, le feedback de pression ou la cohérence de la marge. Gardez le bouton semantique et laissez le gradient être la couche visuelle.
import React from 'react';
import {
Pressable,
StyleSheet,
Text,
ViewStyle,
StyleProp,
} from 'react-native';
import { LinearGradient } from 'expo-linear-gradient';
type Props = {
title: string;
onPress: () => void;
disabled?: boolean;
style?: StyleProp<ViewStyle>;
};
export function GradientButton({
title,
onPress,
disabled = false,
style,
}: Props) {
return (
<Pressable onPress={onPress} disabled={disabled} style={style}>
{({ pressed }) => (
<LinearGradient
colors={
disabled
? ['#94a3b8', '#94a3b8']
: pressed
? ['#7c3aed', '#2563eb']
: ['#8b5cf6', '#3b82f6']
}
start={{ x: 0, y: 0.5 }}
end={{ x: 1, y: 0.5 }}
style={styles.button}
>
<Text style={styles.label}>{title}</Text>
</LinearGradient>
)}
</Pressable>
);
}
const styles = StyleSheet.create({
button: {
minHeight: 52,
borderRadius: 14,
alignItems: 'center',
justifyContent: 'center',
paddingHorizontal: 20,
},
label: {
color: '#fff',
fontSize: 16,
fontWeight: '700',
},
});
Pour les boutons, un gradient horizontal lit mieux qu'un diagonal. Il maintient l'étiquette stable et évite de faire ressentir le contrôle comme incliné.
Le texte de gradient avec une masque
C'est le modèle le plus flashant de l'ensemble, et il est utile lorsque vous le maintenez en retenue. Les titres de héros, les bannières d'amélioration et les titres d'état vide sont de bons candidats. Le texte de paragraphe ne l'est pas.
Vous aurez besoin @react-native-masked-view/masked-view.
npm install @react-native-masked-view/masked-view
Construisez ensuite le masque de texte :
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import MaskedView from '@react-native-masked-view/masked-view';
import { LinearGradient } from 'expo-linear-gradient';
export default function GradientHeadline() {
return (
<View style={styles.container}>
<MaskedView
maskElement={
<View style={styles.maskWrapper}>
<Text style={styles.title}>Premium analytics</Text>
</View>
}
>
<LinearGradient
colors={['#22c55e', '#06b6d4', '#3b82f6']}
start={{ x: 0, y: 0 }}
end={{ x: 1, y: 0 }}
locations={[0, 0.5, 1]}
>
<Text style={[styles.title, styles.hiddenText]}>Premium analytics</Text>
</LinearGradient>
</MaskedView>
</View>
);
}
const styles = StyleSheet.create({
container: {
padding: 24,
},
maskWrapper: {
backgroundColor: 'transparent',
},
title: {
fontSize: 34,
fontWeight: '800',
letterSpacing: -1,
},
hiddenText: {
opacity: 0,
},
});
locations le plus important lorsque vous voulez que l'une des couleurs occupe plus d'espace visuel que l'autre. Si le mélange ressent la boue, réduisez d'abord le nombre de couleurs. Cela fixe généralement la conception plus rapidement que de réglage chaque arrêt.
Apporter les Gradients à la Vie avec les Animations
Les gradients statiques vous donnent du poli. Les gradients animés vous donnent des retours d'information.
La plus grande utilisation pratique n'est pas un arrière-plan flashant. C'est un chargeur qui scintille. Cet effet indique aux utilisateurs que l'application est active, que les données arrivent et que le layout qu'ils voient est intentionnel plutôt que cassé.

Un composant de lueur complète également d'autres modèles de mouvement. Si votre application utilise déjà des icônes animées ou des chargeurs, ce Guide Lottie pour React Native est utile pour décider quand un gradient qui scintille est suffisant et quand un atout d'animation plus riche fait plus de sens.
Un chargeur de glissement qui ressemble à du natif
La version la plus simple fiable utilise react-native-reanimated pour faire déplacer une bande de gradient sur un élément masqué.
Installez Reanimated si ce n'est pas déjà fait dans votre application, puis créez un wrapper avec overflow: 'hidden'Dans lequel, animez une couche de gradient de gauche à droite.
import React, { useEffect } from 'react';
import { StyleSheet, View, ViewStyle, StyleProp } from 'react-native';
import { LinearGradient } from 'expo-linear-gradient';
import Animated, {
useAnimatedStyle,
useSharedValue,
withRepeat,
withTiming,
Easing,
} from 'react-native-reanimated';
const AnimatedView = Animated.createAnimatedComponent(View);
type Props = {
width?: number | string;
height?: number;
borderRadius?: number;
style?: StyleProp<ViewStyle>;
};
export function ShimmerPlaceholder({
width = '100%',
height = 16,
borderRadius = 8,
style,
}: Props) {
const translateX = useSharedValue(-220);
useEffect(() => {
translateX.value = withRepeat(
withTiming(220, {
duration: 1200,
easing: Easing.linear,
}),
-1,
false
);
}, [translateX]);
const animatedStyle = useAnimatedStyle(() => ({
transform: [{ translateX: translateX.value }],
}));
return (
<View
style={[
styles.container,
{ width, height, borderRadius },
style,
]}
>
<AnimatedView style={[styles.shimmer, animatedStyle]}>
<LinearGradient
colors={['rgba(255,255,255,0)', 'rgba(255,255,255,0.35)', 'rgba(255,255,255,0)']}
start={{ x: 0, y: 0.5 }}
end={{ x: 1, y: 0.5 }}
style={styles.gradient}
/>
</AnimatedView>
</View>
);
}
const styles = StyleSheet.create({
container: {
overflow: 'hidden',
backgroundColor: '#e5e7eb',
},
shimmer: {
...StyleSheet.absoluteFillObject,
width: 220,
},
gradient: {
flex: 1,
},
});
C'est le fait que vous n'essayez pas d'animer la définition du gradient lui-même qui fait fonctionner cela. Vous animez une couche de gradient sur un tampon statique. C'est plus simple, plus facile à raisonner et généralement plus stable sur les appareils.
Voici une présentation visuelle de l'effet en pratique :
Le composant animé
Quelques notes d'implémentation sont importantes :
- Utilisez la découpe : Le parent doit
overflow: 'hidden'ou le halo se déversera en dehors des coins arrondis. - Gardez la bande étroite : Une couche animée plus petite est plus facile à ajuster qu'animer la surface entière.
- Correspond au couleur de base à l'écran : Les chargeurs de squelette doivent s'adapter au layout environnant, et pas ressembler à un widget séparé.
Les dégradés animés fonctionnent mieux lorsque les utilisateurs ne les remarquent même pas. Si le bruissement devient le plus fort élément de l'écran, il fait trop.
Performance Accessibilité et Quirks de Plateforme
Une fois les gradients passent des écrans de démo en production, les préoccupations changent. Le code semble toujours simple, mais le comportement de rendu, la lisibilité et la cohérence de la plateforme commencent à compter plus que l'effet initial.
Si vous resserrerez davantage la responsivité de l'application, cela mobile app performance optimization guide réduit les tâches inutiles, mesure sur des appareils réels et optimise les surfaces les plus fréquentées par les utilisateurs.
Liste de vérification de performance
Les gradients natifs sont généralement efficaces, mais vous pouvez toujours les mal utiliser.
- Préférez les gradients aux grandes images décoratives : Ils sont souvent plus propres à envoyer et plus faciles à adapter à plusieurs tailles d'écran.
- Avoid stacking many full-screen layers: Un seul dégradé de fond est acceptable. Plusieurs dégradés superposés translucides, flous et animations lourdes peuvent être coûteux.
- Mémorisez les composants réutilisables : Si une carte de gradient est utilisée dans une liste, maintenez les props stables et évitez de la re-renderiser en raison d'états parent non liés.
Une bonne règle est de garder les gradients structuraux, pas excessifs. Utilisez-les pour définir les surfaces, pas chaque ligne dans un flux dense.
Liste de vérification d'accessibilité
Les gradients peuvent nuire à la lisibilité rapidement car le contraste change en surface.
- Testez le texte contre la zone la plus claire : Si le texte blanc ne fonctionne que sur la face sombre de la combinaison, il ne fonctionne pas.
- Ajoutez un écran lorsque cela est nécessaire : Un léger surimpression sombre entre l'arrière-plan et le texte est souvent préférable à un changement de palette entier.
- Réservez le texte de gradient pour les grandes copies d'écran : Cela se présente bien en titre. C'est une mauvaise option pour les petits labels, les textes d'aide ou tout élément essentiel à une tâche.
Vérifiez le point le plus défavorable du gradient, pas le plus joli.
Liste de contrôles de particularités de plateforme
iOS et Android rendent généralement le même gradient de manière très proche, mais pas toujours parfaitement.
| Problème | Ce qui aide généralement |
|---|---|
| Le gradient ressemble différemment sur les plateformes | Utilisez moins de couleurs et un contraste plus net entre les étapes. |
| Les coins arrondis ne coupent pas le gradient | Placez overflow: 'hidden' sur le conteneur |
| Le gradient ne s'affiche pas du tout | Vérifiez la largeur, la hauteur ou flex: 1 tout d'abord |
Regardez également votre barre d'état et votre traitement de zone de sécurité. Un gradient qui semble équilibré dans l'émulateur peut paraître surchargé sur un appareil avec un trou si le contenu et le fond ne tiennent pas compte de cet espace supplémentaire.
Résolution de problèmes et meilleures pratiques finales
Voici la version concise que je garderais dans une note de projet.
- Correspondre la bibliothèque au flux de travail :
expo-linear-gradientpour les applications Expo géréesreact-native-linear-gradientpour React Native non géré - Considérez les dégradés avec intention. Backgrounds, CTAs, overlays, and hero text are strong use cases.
- Contrôler intentionnellement la direction : Horizontale pour les boutons, diagonale pour les arrières-plans décoratifs, masquée uniquement pour les textes importants.
- Concevoir pour le contenu, pas les états vides : Tester avec du texte réel, des icônes et un traitement de la barre d'état.
- Traiter le setup bare comme un setup natif : Les Pods, la liaison et les mocks Jest ne sont pas des détails optionnels.
Trois échecs courants se présentent à nouveau.
Le gradient ne s'affiche pas.
Cause : le composant n'a pas de taille visible.
Fix : donnez-lui flex: 1une hauteur explicite, ou un parent avec des dimensions. Un gradient sans boîte de mise en page ne s'affichera pas de manière significative.
La compilation iOS se brise après l'installation.
Cause : les pods n'ont pas été installés ou le graphique de dépendance native est désynchronisé.
Fix : exécutez pod install dans ios, nettoyez le dossier de compilation si nécessaire, puis rebuild l'application. Dans les projets bare, l'installation de package seule n'est généralement pas suffisante.
Les tests échouent avec des erreurs de module natif.
Pourquoi : Jest essaie de charger le module natif réel.
Fixe : mock react-native-linear-gradient avec react-native-linear-gradient/jest/linear-gradient-mock dans votre fichier de configuration de Jest.
Si vous gardez une seule idée de ce guide, gardez celle-ci : la gradation elle-même est facile. La mise en place prête à la production est l'effort principal. Une fois que vous avez choisi la bonne bibliothèque pour l'architecture de votre application, tout ce qui suit devient beaucoup plus prévisible.
Si votre équipe développe des applications mobiles hybrides et souhaite envoyer les mises à jour de JavaScript, CSS, copie, configuration et actifs sans attendre la revue de l'App Store. Capgo vaut la peine d'être regardé. Il donne aux équipes de CapacitorJS et Electron des mises à jour en direct contrôlées, des canaux de déploiement, une protection de rollback et une visibilité sur les versions sans transformer votre processus de déploiement en boîte noire.