Probabilmente hai incontrato una delle due situazioni.
O il tuo schermo sembra piatto e incompleto, e desideri un background o un pulsante che sembri un prodotto reale invece di un semplice scaffold. Oppure hai già provato ad aggiungere un gradiente React Native e ora ti ritrovi bloccato nella configurazione perché metà degli esempi utilizzano Expo e l'altra metà assume un progetto nativo nudo.
Quella divisione è dove la maggior parte dei tutorial smette di essere utile. Il componente API è semplice. La scelta dell'ambiente non lo è. colors prop e ulteriori informazioni sulla gestione del workflow Expo o se si gestisce direttamente la linkazione nativa, i pods e i mock dei test.
Perché il tuo'app React Native ha bisogno di gradienti
- Perché la tua App React Native richiede Gradients
- Scegliere la Tua Strada Expo vs Impacchettamento React Native
- Perché il tuo'app React Native ha bisogno di gradienti
- Portare i gradienti alla vita con le animazioni
- Performance, accessibilità e stranezze di piattaforma
- Risolvere problemi e ultime migliori pratiche
Perché il tuo'app React Native ha bisogno di sfumature
Molti UI mobili falliscono per la stessa ragione. La disposizione è corretta, lo spazio è corretto, la tipografia è accettabile, ma lo schermo sembra ancora morto. I riempimenti solidi fanno sembrare tutto come placeholder a meno che il resto del sistema visivo non stia facendo molto lavoro.
A componente di sfumatura React Native component fixes that with very little code. It adds depth, creates separation between sections, and gives high-priority elements a clear visual weight. A good gradient background can make a login screen feel intentional. A good gradient button can make the primary action obvious without resorting to heavy shadows or overly loud borders.
By 2019, Expo-linear-gradient e react-native-linear-gradient sono stati utilizzati in oltre il 42% dei progetti 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 Adozione di gradienti React Native.
Cosa fanno i gradienti
- Creare profondità: Una schermata con un fondo piatto spesso sembra incompiuta. Un leggero sovrapposizione da alto a basso dà alla superficie un aspetto stratificato.
- Guidare l'attenzione: Istruzioni principali, carte di onboarding e intestazioni eroi si distinguono senza aggiungere rumore visivo.
- Sostituire gli asset di immagine: Molti casi, un gradiente ti dà un tocco di classe senza dover caricare immagini di sfondo aggiuntive.
Regola pratica: Usa i gradienti dove la gerarchia è importante. I background, le schede dei capoversi, le superfici dei CTAs e le sovrapposizioni dei media beneficiano di più. I campi di form, le liste dense e i contenitori del testo di corpo non lo sono di solito.
C'è anche un aspetto di design dei prodotti qui. Le squadre che lavorano su più piattaforme già passano tempo a mantenere le interfacce coerenti. Se questo è parte del tuo stack, queste pratiche di UI e UX per applicazioni mobili si allineano bene con lo stesso modo di pensare: meno asset, più superfici riutilizzabili e sistemi visivi che si mantengono su più schermi.
Scegliere il tuo percorso Expo vs Bare React Native Setup
Questo è il fork che causa la maggior parte dei problemi. La rendering API sembra quasi identica in entrambe le librerie, ma la configurazione non lo è.
Se sei in un'app gestita da Expo, utilizza expo-linear-gradientSe sei in un'app React Native nuda, utilizza react-native-linear-gradientNon cercare di sfumare queste linee a meno che non sai esattamente perché lo stai facendo.

Impostazione Expo
Expo è la strada più liscia. L'installazione è lineare, la sincronizzazione delle versioni viene gestita per te e non devi pensare alla linkatura nativa.
Installa come segue:
npx expo install expo-linear-gradient
Utilizza come segue:
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 è la scelta giusta quando vuoi un setup veloce, impostazioni sane e poche angolazioni native. È anche per questo motivo che gli squadre che esplorano flussi di lavoro avanzati di Expo finiscono spesso per utilizzare un cliente di sviluppo di Expo per capacità native personalizzate solo quando il percorso gestito non copre più le esigenze dell'app.
Configurazione React Native base
La configurazione React Native base ti offre accesso diretto ai moduli nativi, ma tu devi gestire le asperità.
Installa il pacchetto:
npm install react-native-linear-gradient
Per iOS, installa i pods:
cd ios && pod install
Utilizzo 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',
},
});
Dove i progetti base si rompono
La parte mancante in quasi tutti i tutorial è la testing e la configurazione nativa. Secondo questa discussione riassuntiva di Stack Overflow, 68% delle discussioni di Stack Overflow su questo argomento nel 2024-2025 coinvolgono fallimenti dei moduli nativi nelle configurazioni React Native base, e la stessa fonte nota problemi ricorrenti con la simulazione Jest e i conflitti CocoaPods di iOS.
Se utilizzi Jest in un'app base, aggiungi la simulazione esplicitamente:
// jest.setup.js
import mockRNLinearGradient from 'react-native-linear-gradient/jest/linear-gradient-mock';
jest.mock('react-native-linear-gradient', () => mockRNLinearGradient);
E riferisciti il file di configurazione in Jest:
module.exports = {
preset: 'react-native',
setupFiles: ['<rootDir>/jest.setup.js'],
};
Funziona bene React Native senza decorazioni. Non perdonerà però un setup incompleto. La maggior parte degli errori non sono bug visivi. Sono problemi di collegamento, pods o ambiente di test.
Di seguito la tabella decisionale pratica:
| Tipo di progetto | Libreria | Scelta migliore |
|---|---|---|
| App gestito da Expo | expo-linear-gradient |
App gestita da Expo |
| Percorso più veloce, meno setup | react-native-linear-gradient |
App React Native senza decorazioni |
| Controllo nativo completo | react-native-linear-gradient + mock |
+ mock (falso positivo) |
Tecniche di Grado Lineare per Elementi di Interfaccia
Un approccio comune è utilizzare lo stesso piccolo insieme di modelli di gradiatura ripetutamente. Fondali. Bottoni. Titoli. Se questi tre sono solidi, puoi riprodurli su molte schermate.

Un utile modello mentale è questo:
colorscontrolla la palettastarteenddirezione di controllolocationscontrolli dove avvengono le transizioni
Se il tuo schermo di avvio o di onboarding utilizza un gradiente, si abbina naturalmente con i modelli di sequenza di avvio più ampi descritti in questo Guida alla schermata di avvio di React Native.
Guida alla schermata di avvio React Native
Gradiature di sfondo a schermo intero
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,
},
});
Un blend diagonale solitamente sembra più dinamico di uno verticale predefinito. Quindi start={{ x: 0, y: 0 }} e end={{ x: 1, y: 1 }} sono un buon default quando lo schermo è principalmente decorativo.
Non scegliere i colori in isolamento. Provali dietro il testo reale, gli iconi e gli stili della barra di stato. Una paletta che sembra bella in Figma può fallire istantaneamente non appena il contenuto si posiziona sopra.
I pulsanti a gradiente che mantengono il comportamento dei pulsanti
L'errore più comune qui è mettere il comportamento di tocco direttamente sul gradiente e dimenticare lo stato disabilitato, il feedback di pressione o la consistenza del padding. Mantieni il pulsante semantico e lascia che il gradiente sia il layer visivo.
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',
},
});
I pulsanti, un gradiente orizzontale legge meglio di uno diagonale. Mantiene la dicitura stabile e evita di far sentire il controllo inclinato.
I testi a gradiente con maschera
Questo è il pattern più flash più flashante del set, e è utile quando lo si tiene a freno. I titoli eroici, le bandiere di aggiornamento e le intestazioni vuote sono buoni candidati. Il testo di paragrafo non lo è.
Avrai bisogno @react-native-masked-view/masked-view.
npm install @react-native-masked-view/masked-view
Poi costruisci la maschera del testo:
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 è ciò che conta di più quando vuoi che un colore occupi più spazio visivo di un altro. Se la miscela sembra torbida, riduci il numero di colori prima. Quello solitamente risolve il design più velocemente di quanto non faccia l'adattamento di ogni stop.
Portare gradienti alla vita con animazioni
Sfumature statiche danno un tocco di classe. Sfumature animate danno feedback.
L'uso più pratico non è un background sfarzoso. È un caricatore che si sfoca. Quell'effetto informa gli utenti che l'app è attiva, i dati stanno arrivando e il layout che stanno vedendo è intenzionale e non rotto.

Un componente sfocato anche completa altri pattern di movimento. Se la tua app già utilizza icone animate o caricatori, questo Guida di Lottie in React Native è utile per decidere quando un gradiente sfocato è sufficiente e quando un asset di animazione più ricco fa più senso.
Un caricatore che si sfoca e si sente nativo
La versione più semplice e affidabile utilizza react-native-reanimated per spostare una banda di gradiente su un placeholder tagliato.
Installa Reanimated se non è già nella tua app, poi crea un wrapper con overflow: 'hidden'all'interno di cui animare un layer di gradiente da sinistra a destra.
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,
},
});
Ciò che rende questo possibile è che non si tenta di animare la definizione del gradiente stesso. Si anima invece un layer di gradiente su un placeholder statico. È più semplice, più facile da ragionare e generalmente più stabile su dispositivi diversi.
Ecco un walkthrough visivo dell'effetto in pratica:
Il componente animato
Alcune note di implementazione sono importanti:
- Usare la clipping: Il padre deve
overflow: 'hidden'o il bagliore si spargerà al di fuori delle curve arrotondate. - Tenere stretto il band: Un layer animato più piccolo è più facile da regolare rispetto all'animazione della superficie intera.
- Corrispondere il colore base alla schermata: I caricamenti di scheletro dovrebbero adattarsi al layout circostante, non sembrare un widget separato.
I gradient animati funzionano meglio quando gli utenti non se ne accorgono quasi. Se lo sfarfallio diventa la cosa più rumorosa sullo schermo, sta facendo troppo.
Performance Accessibilità e Anomalie di Piattaforma
Una volta che i gradienti passano dalle schermate di demo alla produzione, le preoccupazioni cambiano. Il code sembra ancora semplice, ma il comportamento di rendering, la leggibilità e la consistenza della piattaforma diventano più importanti dell'effetto iniziale.
Se stai migliorando la risposta dell'app in modo più ampio, questo Guida all'ottimizzazione della prestazione degli app mobili riduce al minimo il lavoro inutile, misura sulle reali dispositivi e ottimizza le aree più visibili agli utenti.
Elenco di controllo di prestazioni
I gradienti nativi sono generalmente efficienti, ma puoi ancora abusarne.
- Preferare gradienti rispetto a grandi immagini decorative: Sono spesso più puliti da inviare e più facili da adattare a diverse dimensioni dello schermo.
- Evita sovrapporre molti layer a schermo intero. Un gradiente di sfondo è sufficiente. Molti gradienti sovrapposti traslucidi più sfocatura più animazione pesante possono essere costosi.
- Memorizza componenti riutilizzabili: Se una card a gradiente viene utilizzata in una lista, mantieni stabili le proprietà e evita di ricaricarla a causa dello stato del genitore non correlato.
Una buona regola è mantenere i gradienti strutturali, non eccessivi. Utilizzali per definire le superfici, non ogni riga in un feed denso.
Elenco di controllo dell'accessibilità
I gradienti possono danneggiare la leggibilità velocemente perché il contrasto cambia sulla superficie.
- Testo di prova contro l'area più chiara: Se il testo bianco funziona solo sul lato buio della combinazione, non funziona.
- Aggiungi uno schermo quando necessario: Un sottile sovrapposizione scura tra sfondo e testo è spesso meglio che cambiare l'intero paletto.
- Riserva il testo del gradiente per copie di visualizzazione grande: Funziona bene sui titoli. È una cattiva scelta per etichette piccole, testo di aiuto o qualsiasi cosa critica per completare una task.
Controlla il punto peggiore del gradiente, non il più bello.
Elenco dei comportamenti dei dispositivi
IOS e Android rendono spesso lo stesso gradiente con precisione, ma non sempre perfettamente.
| Issue | Cosa aiuta di solito |
|---|---|
| Il gradiente appare diverso tra le piattaforme | Usa meno colori e contrasto chiaro tra i punti di arresto |
| Gli angoli arrotondati non tagliano il gradiente | Colloca overflow: 'hidden' sulla container |
| Il gradiente non si mostra affatto | Controlla larghezza, altezza o flex: 1 primo |
Osserva anche il trattamento della barra dello stato e dell'area di sicurezza. Un gradiente bilanciato nel simulatore può sembrare troppo pesante su un dispositivo con un foro se il contenuto e lo sfondo non tengono conto di quell'extra spazio.
Risolvere Problemi e Pratiche Ottimali Finali
Ecco la versione breve che tengo in una nota del progetto.
- Corrispondi la libreria al flusso di lavoro:
expo-linear-gradientper le app gestite da Exporeact-native-linear-gradientper React Native senza Expo. - Tenere le gradienti utili: Background, CTAs, sovrapposizioni e testo eroe sono casi d'uso forti.
- Controlla la direzione intenzionalmente: Orizzontale per i pulsanti, diagonale per i fondi decorativi, mascherato solo per il grande testo.
- Progetta per il contenuto, non per gli stati vuoti: Testa con copia reale, icona e trattamento della barra dello stato.
- Treat bare setup as native setup: I pod, il collegamento e le mock Jest non sono dettagli facoltativi.
Tre fallimenti comuni si ripetono.
Il gradiente non appare.
Causa: il componente non ha dimensioni visibili.
Risoluzione: dargli flex: 1un'altezza esplicita, o un padre con dimensioni. Un gradiente senza box di layout non renderà in alcun modo significativo.
La compilazione iOS si interrompe dopo l'installazione.
Causa: i pod non sono stati installati o il grafo di dipendenza nativa è fuori sincronia.
Fix: run pod install in iospulisci il cartellone di compilazione se necessario, poi ricostruisci l'app. In progetti bare, l'installazione del pacchetto da solo non è spesso sufficiente.
I test falliscono con errori di modulo nativo
Motivo: Jest sta cercando di caricare il modulo nativo reale.
Risoluzione: mock react-native-linear-gradient con react-native-linear-gradient/jest/linear-gradient-mock in il tuo file di configurazione Jest.
Se conservate un'idea da questa guida, conservate questa: il gradiente stesso è facile. La configurazione pronta per la produzione è lo sforzo principale. Una volta scelto il giusto framework per l'architettura del vostro'app, tutto ciò che segue diventa molto più prevedibile.
Se il vostro team distribuisce app mobili ibride e vuole inviare aggiornamenti di JavaScript, CSS, copia, configurazione e asset senza aspettare la revisione del negozio, Capgo è una cosa da considerare. Dà a CapacitorJS e alle squadre di Electron aggiornamenti live controllati, canali di rilascio, protezione del rollback e visibilità delle versioni senza trasformare il processo di distribuzione in un black box.