Lo scorrimento è suddiviso in più fasi. L'input delta viene inviato tramite una sequenza di fasi per garantire che ogni fase abbia l'opportunità di consumare o reagire al movimento.
Durante questo ciclo, sia il delta di input disponibile sia il delta di input consumato vengono passati a ogni passaggio. In questo modo, ogni fase dispone del contesto completo necessario per reagire, utilizzare o ascoltare l'evento di scorrimento.
Come illustrato nella Figura 1, la procedura di scorrimento segue questo ordine esatto:
- Overscroll:riceve prima il delta di input iniziale, il che dà all'overscroll la possibilità di reagire per primo (ad esempio, rilassando un effetto di allungamento attivo).
- Scorrimento nidificato pre-scorrimento:offre l'opportunità di reagire al delta di input prima della fase di Scorrimento. In questa fase, alcuni delta di input potrebbero essere utilizzati o semplicemente monitorati per attivare modifiche alla UI, ad esempio la compressione o l'espansione di una barra delle app.
- Trasforma delta di input: regola il segno del delta di input non elaborato in base all'orientamento e alla direzione del layout per garantire un comportamento di scorrimento naturale. Per maggiori informazioni, consulta la sezione Trasforma delta di input.
- Scorrimento:questa fase riceve il delta di input disponibile e non utilizzato modificato in modo che corrisponda alla configurazione del contenitore di scorrimento. In genere, utilizza questo delta per aggiornare il proprio offset di scorrimento.
- Ripristina delta di input grezzo: ripristina il delta disponibile e consumato dalla fase Scorrimento al segno delta di input grezzo originale.
- Scorrimento nidificato post-scorrimento:questa fase reagisce dopo il completamento della fase di scorrimento principale, ricevendo i delta disponibili e consumati appena aggiornati. Può consumare qualsiasi input disponibile rimanente o utilizzare il contesto di ciò che è stato appena consumato.
- Scorrimento eccessivo:questa ultima fase esamina i delta finali disponibili e consumati. Qualsiasi input disponibile rimanente che raggiunge questa fase viene in genere utilizzato per generare effetti sui bordi, come un allungamento o una luminosità, che indicano che l'utente ha raggiunto il limite dell'area scorrevole.
Trasforma delta di input
Il delta di input del puntatore richiede aggiustamenti del segno nelle fasi di scorrimento per corrispondere ai contratti previsti. Prima che il delta raggiunga la fase Scorrimento, i modificatori di scorrimento regolano il delta di input in base all'orientamento, alla direzione del layout e ai contesti da destra a sinistra. Ciò accade perché l'input grezzo tiene traccia del movimento fisico dei pixel del puntatore sullo schermo (ad esempio, il movimento verso il basso aumenta la coordinata Y dello schermo, generando un delta positivo). Tuttavia, per ottenere uno "scorrimento naturale" in cui i contenuti si muovono con il dito, trascinare verso il basso significa che la viewport deve spostarsi verso l'alto sui contenuti, il che corrisponde a un offset di scorrimento negativo.
I delta di input provenienti da altre fonti di input, come la rotellina del mouse o il touchpad, non vengono trasformati durante le fasi di scorrimento.
Esempio: il puntatore si sposta a destra utilizzando Modifier.horizontalScroll()
Per capire come vengono consumati e trasformati i delta, consulta la Figura 2, che mostra un gesto in cui il puntatore si sposta verso destra.
- Pre-scroll:il gesto inizia con un delta di input grezzo positivo di 100.
- Overscroll lo osserva e consuma 10, lasciando 90.
- Nested scroll pre-scroll offre al componente principale l'opportunità di reagire, consumando 30. Il delta grezzo rimanente è 60.
- Trasformazione A: prima di entrare nella fase di Scorrimento,
horizontalScrollinverte il delta grezzo positivo rimanente (60) in un delta negativo (-60). In questo modo, il riquadro si sposta a sinistra e i contenuti sembrano spostarsi a destra con il dito dell'utente. - Scorrimento:il componente scorrevole di destinazione utilizza una parte di questo delta trasformato per aggiornare l'offset di scorrimento. In questo esempio, consuma -30, lasciando -30 non consumati.
- Trasformazione B: il delta di scorrimento non utilizzato (-30) viene riconvertito in un delta grezzo positivo (30) in modo che corrisponda al contratto di scorrimento nidificato e scorrimento eccessivo.
- Post-scroll: il delta grezzo rimanente viene ripassato nella pipeline.
- Nested scroll post-scroll consuma 10, lasciando 20.
- L'effetto di overscroll utilizza gli ultimi 20 per generare effetti visivi sui bordi, come un allungamento o una luminescenza, risolvendo completamente il delta di input a 0.
Riferimento alla trasformazione delta dell'input del puntatore
La seguente tabella illustra come vengono firmati i delta di input nelle diverse fasi e direzioni per l'input del puntatore.
| Delta input non elaborato | Effetto overscroll | Scorrimento nidificato | scrollableArea con orientamento orizzontale |
scrollableArea con orientamento orizzontale (invertito) |
scrollableArea con orientamento verticale |
scrollableArea con orientamento verticale (invertito) |
|
|---|---|---|---|---|---|---|---|
| Il puntatore si sposta VERSO L'ALTO | Negativo | Negativo | Negativo | N/D | N/D | Positivo | Negativo |
| Il puntatore si sposta IN BASSO | Positivo | Positivo | Positivo | N/D | N/D | Negativo | Positivo |
| Il puntatore si sposta A SINISTRA | Negativo | Negativo | Negativo | Positivo (negativo per RTL) | Negativo (positivo per RTL) | N/D | N/D |
| Il puntatore si sposta a DESTRA | Positivo | Positivo | Positivo | Negativo (positivo per RTL) | Positivo (negativo per RTL) | N/D | N/D |