Pressable — cos’è, gestione delle pressioni in React Native

Autore: IT Sectr Pubblicato: 2026-07-06 Tempo di lettura: 10 min

Pressable è un componente moderno di React Native per la gestione dei tocchi, che sostituisce i vecchi TouchableHighlight, TouchableOpacity e TouchableWithoutFeedback. Pressable fornisce un’API unificata con rilevamento degli stati pressed, hovered e focused. Il componente è stato introdotto in React Native 0.63 ed è raccomandato da Meta per tutti i nuovi progetti. Scopri di più nella documentazione di Meta.

Punti chiave

  • Pressable — un componente universale per la gestione dei tocchi con supporto degli stati pressed, hovered e focused
  • API include callback onPress, onLongPress, onPressIn, onPressOut e una funzione di stile basata sullo stato
  • hitSlop estende l’area tattile oltre i limiti visibili del componente per migliorare l’UX
  • Sostituzione di Touchable — Pressable unifica l’API di tutti i componenti Touchable in un’interfaccia flessibile
  • Accessibilità — il componente supporta i ruoli ARIA e gestisce automaticamente VoiceOver e TalkBack

Cos’è Pressable?

Pressable è un componente React Native che fornisce un’interfaccia unificata per gestire tutti i tipi di tocchi. A differenza di tre diversi componenti Touchable (TouchableHighlight, TouchableOpacity, TouchableWithoutFeedback), Pressable li sostituisce tutti con un sistema flessibile di stati e stili.

Il componente è stato introdotto in React Native 0.63 (settembre 2020). Secondo Meta (2026), il 70% dei nuovi progetti React Native utilizza Pressable invece dei componenti Touchable. Pressable risolve il problema chiave di Touchable — un’API frammentata e la necessità di passare da un componente all’altro per effetti diversi.

Filosofia di Pressable

A differenza di TouchableOpacity, dove l’effetto di pressione è fisso (cambio di opacità), Pressable fornisce una funzione che riceve lo stato corrente. Lo sviluppatore decide come reagire visivamente a una pressione: cambiare colore, scala, ombra o una combinazione di effetti. Questo dà il controllo completo sull’UX.

Stati di Pressable: pressed, hovered, focused

Pressable definisce tre stati di interazione: pressed (dito sullo schermo), hovered (cursore sull’elemento su Web/TV), focused (elemento con focus da tastiera). Ogni stato attiva il callback corrispondente e viene passato alla funzione di stile e alla funzione di rendering figlio.

StatoCondizioneReazione tipica
pressedDito sullo schermo o clic tenutoCambio di opacità, scala o colore di sfondo
hoveredCursore sull’elemento (Web, TV)Evidenziazione, ombra, sottolineatura
focusedElemento con focus da tastieraContorno, bordo, cambio di colore

Importante: hovered e focused funzionano solo su piattaforme con supporto del puntatore (Web, Android TV, Apple TV). Su dispositivi mobili, è disponibile solo pressed. Per applicazioni multipiattaforma, progetta le reazioni visive tenendo conto di questa limitazione.

js
<Pressable
  style={({ pressed }) => [
    styles.button,
    pressed && styles.buttonPressed,
  ]}
  onPress={handlePress}>
  {({ pressed }) => (
    <Text style={pressed ? styles.textPressed : styles.text}>
      {pressed ? 'Release' : 'Press'}
    </Text>
  )}
</Pressable>

API e callback di Pressable

L’API di Pressable include quattro callback principali: onPress (pressione completa con rilascio), onLongPress (pressione lunga), onPressIn (inizio tocco) e onPressOut (fine tocco). La combinazione di onPressIn e onPressOut consente di creare animazioni personalizzate.

Props aggiuntive: delayLongPress (ritardo della pressione lunga, default 500 ms), pressRetentionOffset (area oltre la quale la pressione viene annullata), android_ripple (effetto ripple su Android). Nota: Ripple funziona solo su Android 5+.

js
<Pressable
  onPress={() => console.log('Premuto')}
  onLongPress={() => console.log('Pressione lunga')}
  onPressIn={() => console.log('Dito giù')}
  onPressOut={() => console.log('Dito su')}
  delayLongPress={300}
  android_ripple={{ color: 'rgba(0,0,0,0.1)', borderless: false }}
  style={styles.button}>
  <Text>Press me</Text>
</Pressable>

onPress viene chiamato solo se il dito viene sollevato all’interno dell’area del componente (considerando pressRetentionOffset). Se l’utente sposta il dito fuori dai limiti, onPress non viene attivato, prevenendo pressioni false. onPressOut viene chiamato in ogni caso al rilascio.

hitSlop: espandere l’area tattile

hitSlop è una prop di Pressable che estende l’area tattile oltre i limiti visibili del componente. Questo è fondamentale per elementi piccoli: icone, caselle di controllo, pulsanti radio. Apple HIG raccomanda una dimensione minima del bersaglio tattile di 44×44 punti. hitSlop consente di soddisfare questo requisito senza modificare la dimensione visiva.

hitSlop accetta un oggetto { top, bottom, left, right } o un singolo numero per tutti i lati. I valori sono specificati in pixel logici (dp/pt). Per le icone 24×24, si consiglia un hitSlop di almeno 10–12 su ciascun lato per raggiungere il bersaglio tattile di 44×44.

js
<Pressable
  hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}
  onPress={handleIconPress}
  style={styles.iconButton}>
  <Icon name="star" size={24} />
</Pressable>

pressRetentionOffset — l’inverso di hitSlop: definisce l’area in cui l’utente può uscire dai limiti del componente senza annullare la pressione. Per impostazione predefinita, è uguale a hitSlop. Se hai bisogno che la pressione persista quando si esce dai limiti, aumenta pressRetentionOffset.

Pressable vs Touchable: quando migrare

Pressable vs Touchable — una domanda chiave nella scelta di un componente per la gestione dei tocchi. TouchableOpacity, TouchableHighlight e TouchableWithoutFeedback sono componenti obsoleti che non verranno rimossi ma non riceveranno nuove funzionalità. Meta raccomanda Pressable per i nuovi progetti.

Vantaggi principali di Pressable: API unificata per tutti i tipi di effetti, accesso allo stato pressed per stili personalizzati, supporto degli stati hovered/focused, hitSlop e pressRetentionOffset, callback onLongPress senza configurazione aggiuntiva. TouchableOpacity è adatto solo per semplici cambi di opacità.

ScenarioTouchablePressable
Pressione sempliceTouchableOpacityPressable + opacity in style
Evidenziazione sfondoTouchableHighlightPressable + backgroundColor
Nessun effetto visivoTouchableWithoutFeedbackPressable con style vuoto
Pressione lungaonLongPress su qualsiasi TouchableonLongPress su Pressable
Animazione personalizzataAnimated + onPressIn/OutPressable + useAnimatedStyle
Ripple su AndroidTouchableNativeFeedbackPressable + android_ripple

Esempi di utilizzo di Pressable

Pressable consente di creare elementi interattivi complessi con un codice minimo. Di seguito è riportato un esempio di un pulsante animato con cambio di scala alla pressione ed effetto ripple su Android. Tale pulsante sostituisce la combinazione TouchableOpacity + Animated.

js
const AnimatedButton = ({ title, onPress }) => {
  const scale = React.useRef(new Animated.Value(1)).current;

  const handlePressIn = () => {
    Animated.spring(scale, {
      toValue: 0.96,
      useNativeDriver: true,
    }).start();
  };

  const handlePressOut = () => {
    Animated.spring(scale, {
      toValue: 1,
      friction: 3,
      useNativeDriver: true,
    }).start();
  };

  return (
    <Pressable
      onPress={onPress}
      onPressIn={handlePressIn}
      onPressOut={handlePressOut}
      android_ripple={{ color: 'rgba(255,255,255,0.3)' }}
      style={styles.button}>
      <AnimatedView style={[styles.inner, { transform: [{ scale }] }]}>
        <Text style={styles.text}>{title}</Text>
      </AnimatedView>
    </Pressable>
  );
};

Importante: usa useNativeDriver: true per le animazioni in Pressable. Questo scarica l’animazione sul thread nativo, prevenendo cadute di frame durante pressioni rapide. Il driver nativo è supportato per transform e opacity su tutte le piattaforme.

Domande frequenti

Posso usare Pressable al posto di TouchableOpacity senza modificare il codice?

No, Pressable ha un’API diversa. TouchableOpacity applica automaticamente l’opacità alla pressione. Pressable richiede la specifica esplicita dello stile tramite una funzione di stato. La sostituzione è banale: passa style={({ pressed }) => [{ opacity: pressed ? 0.5 : 1 }]}.

Come creare un effetto ripple come in Material Design?

Usa la prop android_ripple con un oggetto { color, borderless }. Il colore del ripple è specificato in formato rgba. Per i pulsanti rotondi, usa borderless: true. Ripple funziona solo su Android 5+. Su iOS, usa un’animazione personalizzata.

Perché onPress non si attiva durante lo scorrimento veloce?

Pressable ha una protezione integrata contro le pressioni accidentali durante lo scorrimento. Se l’utente scorre un elenco, onPress non viene chiamato. Questo comportamento può essere configurato tramite pressRetentionOffset e delayPressIn.

Come rilevare una pressione lunga con Pressable?

Usa la prop onLongPress — supporto integrato per la pressione lunga. Il ritardo è configurabile tramite delayLongPress (default 500 ms). Per menu contestuali e drag-and-drop, combina onLongPress con onPressIn.

Pressable supporta la navigazione tramite tastiera?

Sì, Pressable supporta lo stato focused per la navigazione tramite tastiera su Android TV, Apple TV e Web. Usa lo stile tramite { focused } per visualizzare il focus. Su dispositivi mobili, lo stato focused non è applicabile.

Riepilogo

  • Pressable — un componente universale React Native per la gestione dei tocchi, sostituisce TouchableOpacity, TouchableHighlight e TouchableWithoutFeedback
  • Stati pressed, hovered, focused vengono passati alla funzione di stile, consentendo di personalizzare la reazione per ogni scenario
  • hitSlop estende il bersaglio tattile a 44×44 punti senza modificare la dimensione visiva, migliorando l’UX su elementi piccoli
  • API include onPress, onLongPress, onPressIn, onPressOut con ritardo configurabile tramite delayLongPress
  • android_ripple aggiunge un effetto ripple Material Design su Android 5+ con colore e forma personalizzabili
  • Migrazione da Touchable richiede la sostituzione degli effetti automatici con stili espliciti tramite una funzione di stato
  • Animated + Pressable creano animazioni di pressione fluide con useNativeDriver per le prestazioni

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche