px — un pixel fisico, l'elemento più piccolo di un'immagine sullo schermo di un dispositivo. Nello sviluppo mobile, px viene utilizzato come unità di base della risoluzione dello schermo e della densità di pixel (PPI), ma praticamente mai per il layout dell'interfaccia — invece vengono utilizzate le unità logiche pt, dp e sp. Questo articolo spiega in che modo px si differenzia dalle unità logiche, come sono correlate risoluzione e PPI e perché utilizzare px direttamente nel codice è un anti-pattern.
Punti chiave
px (pixel, picture element) — il più piccolo elemento indirizzabile di un'immagine raster o di un display. Ogni pixel memorizza informazioni sul colore nel modello RGB (rosso, verde, blu) con una profondità di colore da 8 a 10 bit per canale. I display dei moderni dispositivi mobili contengono milioni di pixel: iPhone 15 Pro — 3 milioni, iPad Pro 12,9" — 5,6 milioni di pixel.
La dimensione fisica di un pixel dipende dalla densità del display (PPI). Su un dispositivo con 326 PPI (iPhone 11), un pixel misura circa 0,078 mm. Su un display con 460 PPI (iPhone 15 Pro) — 0,055 mm. Più piccola è la dimensione fisica del pixel, maggiore è la nitidezza dell'immagine. Allo stesso tempo, la densità di pixel influisce direttamente sulle prestazioni di rendering: più pixel = più lavoro per la GPU.
Secondo Apple, la risoluzione del display dell'iPhone 15 Pro è 1179 × 2556 px a 460 PPI. Per confronto, iPhone SE (3ª gen.) — 750 × 1334 px a 326 PPI. La differenza nel numero totale di pixel è quasi 3 volte, il che spiega i requisiti GPU più elevati sui modelli Pro.
Risoluzione dello schermo — il numero di pixel fisici orizzontalmente e verticalmente. Viene scritta nel formato larghezza × altezza, ad esempio 1179 × 2556 px. La risoluzione è una caratteristica fondamentale del display che non può essere modificata a livello di programmazione — è fissata a livello hardware e di matrice.
| Dispositivo | Risoluzione (px) | PPI | Rapporto d'aspetto |
|---|---|---|---|
| iPhone SE (3ª gen.) | 750 × 1334 | 326 | 16:9 |
| iPhone 14 | 1170 × 2532 | 460 | 19.5:9 |
| iPhone 15 Pro Max | 1290 × 2796 | 460 | 19.5:9 |
| Samsung Galaxy S24 Ultra | 1440 × 3120 | 505 | 19.5:9 |
| Google Pixel 8 Pro | 1344 × 2992 | 490 | 20:9 |
| iPad Pro 12,9" | 2048 × 2732 | 264 | 4:3 |
La risoluzione in pixel non va confusa con la dimensione logica dello schermo (in pt per iOS o dp per Android). Ad esempio, l'iPhone 14 ha una dimensione logica di 390 × 844 pt, ma una risoluzione fisica di 1170 × 2532 px — esattamente 3 volte più grande, poiché il fattore di scala è 3.
PPI (pixel per pollice) — il numero di pixel per pollice del display. Calcolato con la formula: PPI = √(larghezza² + altezza²) / diagonale. Più alto è il PPI, più piccoli sono i singoli pixel e più liscia appare l'immagine. Apple considera un display Retina quello con PPI superiore a 300 a una distanza di visione tipica.
Diverse categorie di dispositivi hanno densità diverse: Apple Watch — 326 PPI, iPhone — 326–460 PPI, iPad — 264 PPI, MacBook Pro — 254–264 PPI. I dispositivi Android classificano la densità tramite Density Buckets: mdpi (160 dpi), hdpi (240), xhdpi (320), xxhdpi (480), xxxhdpi (640). Questi bucket determinano quale risorsa (immagine, dimens) verrà caricata per il dispositivo.
Impatto del PPI sullo sviluppo: maggiore è la densità, più memoria è necessaria per memorizzare texture e immagini. Un pixel su un display da 500 PPI richiede 2,5 volte più memoria GPU rispetto a un display da 320 PPI per la stessa dimensione logica dell'elemento. Ottimizzare gli asset per bucket di densità specifici è una pratica standard nello sviluppo Android.
I pixel fisici (px) differiscono dalle unità logiche (pt, dp, sp) perché sono legati alla risoluzione hardware e non si ridimensionano. Le unità logiche, al contrario, astraggono lo sviluppatore dal display specifico, consentendo a un singolo valore di 100 pt di essere visualizzato con la stessa dimensione fisica su dispositivi diversi.
| Unità | Piattaforma | Dipende da PPI | Scala | Scopo |
|---|---|---|---|---|
| px | Tutte | Sì (pixel fisico) | No | Immagini, buffer, Metal |
| pt | iOS/macOS | No (punto logico) | fattore di scala | Layout, UIKit, SwiftUI |
| dp | Android | No (indip. densità) | bucket densità | Layout, dimensioni elementi |
| sp | Android | No (indip. scala) | densità + scala font | Testo (textSize) |
Formule di conversione: per iOS — px = pt × scale (dove scale = 1, 2 o 3). Per Android — px = dp × (dpi / 160). L'uso diretto di px nel codice significa che l'interfaccia apparirà diversa su dispositivi con densità diverse: su uno schermo ad alto PPI l'elemento sarà troppo piccolo, mentre su un PPI basso — troppo grande.
Usare px nel codice sorgente di un'applicazione mobile è un anti-pattern che porta a una visualizzazione errata dell'interfaccia su dispositivi con diversa densità di pixel. I framework moderni (UIKit, SwiftUI, Jetpack Compose, XML Layouts) vietano o sconsigliano di specificare le dimensioni in pixel.
L'unico uso legittimo di px nel codice è lavorare con i raster: caricare Bitmap, creare Canvas per il rendering di immagini, lavorare con Metal o OpenGL. In questi casi, px sono i pixel fisici del buffer di destinazione e devono essere considerati per un rendering corretto. In tutti gli altri casi, vengono utilizzate unità logiche.
Immagini e icone sono memorizzate in pixel, ma per ogni tipo di schermo vengono fornite versioni diverse. iOS utilizza i suffissi @1x, @2x, @3x in Assets.xcassets. Android utilizza le cartelle drawable-mdpi (1×), drawable-hdpi (1,5×), drawable-xhdpi (2×), drawable-xxhdpi (3×), drawable-xxxhdpi (4×). Il sistema seleziona automaticamente il file corretto in base alla densità dello schermo.
| Scala iOS | Bucket Android | Fattore | Esempio (48 pt/dp) |
|---|---|---|---|
| @1x | mdpi (160 dpi) | 1× | 48 × 48 px |
| @2x | xhdpi (320 dpi) | 2× | 96 × 96 px |
| @3x | xxhdpi (480 dpi) | 3× | 144 × 144 px |
| — | xxxhdpi (640 dpi) | 4× | 192 × 192 px |
Regola di fornitura degli asset: crea l'immagine in formato vettoriale (PDF, SVG) ed esportala in copie raster delle dimensioni necessarie. Gli asset vettoriali si ridimensionano senza perdita di qualità e occupano meno spazio nel repository. In Android, le risorse vettoriali possono essere utilizzate direttamente tramite VectorDrawable, eliminando la necessità di multiple copie raster.
Domande frequenti
px — un pixel fisico dello schermo. dp (density-independent pixel) — un'unità logica Android pari a 1 px su uno schermo con densità di 160 dpi. A diverse densità, dp si converte automaticamente in un diverso numero di px, preservando la dimensione fisica dell'elemento.
Perché px non tiene conto della densità dello schermo. Un elemento di 100 px apparirà diverso su dispositivi con PPI diverso: su uno schermo a 326 PPI sarà più grande che a 460 PPI. Le unità logiche (dp, pt, sp) risolvono automaticamente questo problema.
PPI (pixel per pollice) — il numero di pixel per pollice del display. Calcolato con la formula: PPI = √(l² + a²) / d, dove l e a sono la risoluzione in px, d è la diagonale in pollici. Più alto è il PPI, più nitida è l'immagine. Il display Retina di Apple parte da 300 PPI.
px è giustificato quando si lavora con buffer raster: creare Bitmap, eseguire il rendering in Canvas, programmare shader Metal/OpenGL, elaborare immagini dalla fotocamera. Nel layout e nella tipografia, px non viene utilizzato — vengono applicati pt (iOS), dp e sp (Android).
In iOS: UIScreen.main.nativeBounds restituisce la dimensione in px. In Android: DisplayMetrics.widthPixels e heightPixels da context.resources.displayMetrics. In SwiftUI: GeometryReader restituisce la dimensione in pt, per px è necessario moltiplicare per displayScale.
Riepilogo
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.
Leggi anche