px — pixelul fizic, elementul minim al imaginii pe ecranul unui dispozitiv. În dezvoltarea mobilă px este folosit ca unitate de bază a rezoluției ecranului și densității pixelilor (PPI), dar practic nu se aplică pentru alcătuirea interfețelor — în locul său se folosesc unitățile logice pt, dp și sp. Articolul explică cu ce se deosebește px de unitățile logice, cum sunt legate rezoluția și PPI și de ce utilizarea directă a px în cod este un antipattern.
Principalele
px (pixel, picture element) — cel mai mic element adresabil al unei imagini raster sau al unui afișaj. Fiecare pixel stochează informații despre culoare în modelul RGB (roșu, verde, albastru) cu o adâncime de culoare de 8 până la 10 biți pe canal. Afișajele moderne ale dispozitivelor mobile conțin milioane de pixeli: iPhone 15 Pro — 3 milioane, iPad Pro 12.9" — 5.6 milioane de pixeli.
Dimensiunea fizică a pixelului depinde de densitatea afișajului (PPI). Pe un dispozitiv cu 326 PPI (iPhone 11) un pixel are aproximativ 0.078 mm. Pe un afișaj cu 460 PPI (iPhone 15 Pro) — 0.055 mm. Cu cât dimensiunea fizică a pixelului este mai mică, cu atât claritatea imaginii este mai mare. Densitatea pixelilor influențează direct performanța de randare: mai mulți pixeli = mai multă muncă pentru GPU.
Conform datelor Apple, rezoluția afișajului iPhone 15 Pro este de 1179 × 2556 px la o densitate de 460 PPI. Pentru comparație, iPhone SE (3rd gen) — 750 × 1334 px la 326 PPI. Diferența în numărul total de pixeli este de aproape 3 ori, ceea ce explică cerințele mai mari pentru GPU pe modelele Pro.
Rezoluția ecranului — numărul de pixeli fizici pe orizontală și verticală. Se scrie în formatul lățime × înălțime, de exemplu 1179 × 2556 px. Rezoluția este o caracteristică fundamentală a afișajului care nu poate fi modificată programatic — este fixată la nivelul hardware-ului și al matricei.
| Dispozitiv | Rezoluție (px) | PPI | Raport de aspect |
|---|---|---|---|
| iPhone SE (3rd 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 |
Rezoluția în pixeli nu trebuie confundată cu dimensiunea logică a ecranului (în pt pentru iOS sau dp pentru Android). De exemplu, iPhone 14 are o dimensiune logică de 390 × 844 pt, dar o rezoluție fizică de 1170 × 2532 px — de exact 3 ori mai mare, deoarece factorul de scală este 3.
PPI (pixels per inch) — numărul de pixeli care revin unui țol de afișaj. Se calculează după formula: PPI = √(lățime² + înălțime²) / diagonală. Cu cât PPI este mai mare, cu atât pixelii individuali sunt mai fini și imaginea apare mai netedă. Apple consideră un afișaj Retina atunci când PPI depășește 300 la o distanță tipică de vizualizare.
Categorii diferite de dispozitive au densități diferite: ceasurile Apple Watch — 326 PPI, iPhone — 326–460 PPI, iPad — 264 PPI, MacBook Pro — 254–264 PPI. Dispozitivele Android clasifică densitatea prin Density Buckets: mdpi (160 dpi), hdpi (240), xhdpi (320), xxhdpi (480), xxxhdpi (640). Aceste găleți determină ce resursă (imagine, dimens) va fi încărcată pentru dispozitiv.
Influența PPI asupra dezvoltării: cu cât densitatea este mai mare, cu atât mai multă memorie este necesară pentru stocarea texturilor și imaginilor. Un pixel pe un afișaj cu 500 PPI necesită de 2.5 ori mai multă memorie GPU decât pe un afișaj cu 320 PPI la aceeași dimensiune logică a elementului. Optimizarea activelor pentru găleți specifice de densitate este o practică standard în dezvoltarea Android.
Pixelii fizici (px) diferă de unitățile logice (pt, dp, sp) prin faptul că sunt legați de rezoluția hardware și nu se scalează. Unitățile logice, dimpotrivă, abstractizează dezvoltatorul de afișajul concret, permițând aceleiași valori de 100 pt să se afișeze cu aceeași dimensiune fizică pe dispozitive diferite.
| Unitate | Platformă | Depinde de PPI | Se scalează | Pentru ce |
|---|---|---|---|---|
| px | Toate | Da (pixel fizic) | Nu | Imagini, buffere, Metal |
| pt | iOS/macOS | Nu (punct logic) | scale factor | Layout, UIKit, SwiftUI |
| dp | Android | Nu (independent de densitate) | density bucket | Layout, dimensiuni elemente |
| sp | Android | Nu (independent de scară) | density + font scale | Text (textSize) |
Formule de recalculare: pentru iOS — px = pt × scale (unde scale = 1, 2 sau 3). Pentru Android — px = dp × (dpi / 160). Utilizarea directă a px în cod înseamnă că interfața va arăta diferit pe dispozitive cu densități diferite: pe un ecran cu PPI ridicat elementul va fi prea mic, iar pe unul cu PPI scăzut — prea mare.
Utilizarea px în codul sursă al unei aplicații mobile — antipattern care duce la afișarea incorectă a interfeței pe dispozitive cu densități diferite ale pixelilor. Framework-urile moderne (UIKit, SwiftUI, Jetpack Compose, XML Layouts) interzic sau nu recomandă specificarea dimensiunilor în pixeli.
Singura utilizare legitimă a px în cod — lucrul cu rastere: încărcarea Bitmap, crearea Canvas pentru randarea imaginilor, lucrul cu Metal sau OpenGL. În aceste cazuri px — pixelii fizici ai bufferului țintă și trebuie luați în considerare pentru o randare corectă. În toate celelalte cazuri se folosesc unități logice.
Imaginile și pictogramele sunt stocate în pixeli, dar pentru fiecare tip de ecran sunt furnizate versiuni diferite. iOS folosește sufixele @1x, @2x, @3x în Assets.xcassets. Android folosește folderele drawable-mdpi (1×), drawable-hdpi (1.5×), drawable-xhdpi (2×), drawable-xxhdpi (3×), drawable-xxxhdpi (4×). Sistemul alege automat fișierul potrivit pe baza densității ecranului.
| iOS scale | Android bucket | Coeficient | Exemplu (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 |
Regula de furnizare a activelor: creați imaginea în format vectorial (PDF, SVG) și exportați în copii raster de dimensiunile necesare. Activele vectoriale se scalează fără pierdere de calitate și ocupă mai puțin spațiu în depozit. În Android resursele vectoriale pot fi utilizate direct prin VectorDrawable, ceea ce elimină necesitatea multiplelor copii raster.
Întrebări frecvente
px — pixelul fizic al ecranului. dp (density-independent pixel) — unitatea logică Android, egală cu 1 px pe un ecran cu densitatea de 160 dpi. La densități diferite dp se convertește automat într-un număr diferit de px, păstrând dimensiunea fizică a elementului.
Pentru că px nu ia în considerare densitatea ecranului. Un element de 100 px va arăta diferit pe dispozitive cu PPI diferit: pe un ecran de 326 PPI va fi mai mare decât pe unul de 460 PPI. Unitățile logice (dp, pt, sp) rezolvă această problemă automat.
PPI (pixels per inch) — numărul de pixeli pe țol de afișaj. Se calculează după formula: PPI = √(w² + h²) / d, unde w și h — rezoluția în px, d — diagonala în țoli. Cu cât PPI este mai mare, cu atât imaginea este mai clară. Afișajul Retina Apple începe de la 300 PPI.
px este justificat la lucrul cu buffere raster: crearea Bitmap, randarea în Canvas, programarea shader-elor Metal/OpenGL, procesarea imaginilor de la cameră. În layout și tipografie px nu se folosește — se aplică pt (iOS), dp și sp (Android).
În iOS: UIScreen.main.nativeBounds returnează dimensiunea în px. În Android: DisplayMetrics.widthPixels și heightPixels din context.resources.displayMetrics. În SwiftUI: GeometryReader returnează dimensiunea în pt, pentru px trebuie înmulțit cu displayScale.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și