px — физички пиксел, минимални елемент слике на екрану уређаја. У мобилном развоју px се користи као основна јединица резолуције екрана и густине пиксела (PPI), али се практично не примењује за израду интерфејса — уместо њега се користе логичке јединице pt, dp и sp. Чланак објашњава чиме се px разликује од логичких јединица, како су повезани резолуција и PPI и зашто је директно коришћење px у коду антиобразац.
Главно
px (pixel, picture element) — најмањи адресабилни елемент растерске слике или дисплеја. Сваки пиксел чува информацију о боји у RGB моделу (црвена, зелена, плава) са дубином боје од 8 до 10 бита по каналу. Савремени дисплеји мобилних уређаја садрже милионе пиксела: iPhone 15 Pro — 3 милиона, iPad Pro 12.9" — 5.6 милиона пиксела.
Физичка величина пиксела зависи од густине дисплеја (PPI). На уређају са 326 PPI (iPhone 11) један пиксел има величину приближно 0.078 mm. На дисплеју са 460 PPI (iPhone 15 Pro) — 0.055 mm. Што је мања физичка величина пиксела, то је већа оштрина слике. Густина пиксела директно утиче на перформансе рендеровања: више пиксела = више посла за GPU.
Према Apple подацима, резолуција дисплеја iPhone 15 Pro износи 1179 × 2556 px при густини од 460 PPI. За поређење, iPhone SE (3rd gen) — 750 × 1334 px при 326 PPI. Разлика у укупном броју пиксела је скоро 3 пута, што објашњава веће захтеве за GPU на Pro моделима.
Резолуција екрана — број физичких пиксела по хоризонтали и вертикали. Записује се у формату ширина × висина, нпр. 1179 × 2556 px. Резолуција је фундаментална карактеристика дисплеја која се не може променити програмски — фиксирана је на нивоу хардвера и матрице.
| Уређај | Резолуција (px) | PPI | Однос страница |
|---|---|---|---|
| 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 |
Резолуција у пикселима не треба да се меша са логичком величином екрана (у pt за iOS или dp за Android). На пример, iPhone 14 има логичку величину 390 × 844 pt, али физичку резолуцију 1170 × 2532 px — тачно 3 пута већу, јер је scale factor једнак 3.
PPI (pixels per inch) — број пиксела који пада на један инч дисплеја. Израчунава се по формули: PPI = √(ширина² + висина²) / дијагонала. Што је PPI већи, то су појединачни пиксели ситнији и слика изгледа глаткије. Apple сматра Retina дисплејем екран са PPI изнад 300 на типичној удаљености гледања.
Различите категорије уређаја имају различиту густину: сатови Apple Watch — 326 PPI, iPhone — 326–460 PPI, iPad — 264 PPI, MacBook Pro — 254–264 PPI. Android уређаји класификују густину кроз Density Buckets: mdpi (160 dpi), hdpi (240), xhdpi (320), xxhdpi (480), xxxhdpi (640). Ова корпица одређује који ресурс (слика, dimens) ће бити учитан за уређај.
Утицај PPI на развој: што је већа густина, то је више меморије потребно за складиштење текстура и слика. Пиксел на дисплеју са 500 PPI захтева 2.5 пута више GPU меморије него на дисплеју са 320 PPI при истој логичкој величини елемента. Оптимизација ресурса за одређене корпице густине — стандардна пракса у Android развоју.
Физички пиксели (px) разликују се од логичких јединица (pt, dp, sp) по томе што су везани за хардверску резолуцију и не скалирају се. Логичке јединице, напротив, апстрахују програмера од конкретног дисплеја, омогућавајући истој вредности 100 pt да се прикаже са истом физичком величином на различитим уређајима.
| Јединица | Платформа | Зависи од PPI | Скалира се | За шта |
|---|---|---|---|---|
| px | Све | Да (физички пиксел) | Не | Слике, бафери, Metal |
| pt | iOS/macOS | Не (логичка тачка) | scale factor | Layout, UIKit, SwiftUI |
| dp | Android | Не (независна од густине) | density bucket | Layout, величине елемената |
| sp | Android | Не (независна од скале) | density + font scale | Текст (textSize) |
Формуле прерачунавања: за iOS — px = pt × scale (где је scale = 1, 2 или 3). За Android — px = dp × (dpi / 160). Директно коришћење px у коду значи да ће интерфејс изгледати другачије на уређајима са различитом густином: на екрану са високим PPI елемент ће бити превише мали, а на ниском — превише велики.
Коришћење px у изворном коду мобилне апликације — антиобразац који доводи до неисправног приказа интерфејса на уређајима са различитом густином пиксела. Савремени оквири (UIKit, SwiftUI, Jetpack Compose, XML Layouts) забрањују или не препоручују навођење димензија у пикселима.
Једина легитимна употреба px у коду — рад са растерским баферима: учитавање Bitmap, креирање Canvas за рендеровање слика, рад са Metal или OpenGL. У овим случајевима px — физички пиксели циљног бафера и морају се узети у обзир за исправно рендеровање. У свим осталим случајевима користе се логичке јединице.
Слике и иконе се чувају у пикселима, али за сваки тип екрана испоручују се различите верзије. iOS користи суфиксе @1x, @2x, @3x у Assets.xcassets. Android користи фасцикле drawable-mdpi (1×), drawable-hdpi (1.5×), drawable-xhdpi (2×), drawable-xxhdpi (3×), drawable-xxxhdpi (4×). Систем аутоматски бира одговарајући фајл на основу густине екрана.
| iOS scale | Android bucket | Коефицијент | Пример (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 |
Правило испоруке ресурса: направите слику у векторском формату (PDF, SVG) и извезите у растерске копије потребних величина. Векторски ресурси се скалирају без губитка квалитета и заузимају мање простора у репозиторијуму. У Android-у векторски ресурси могу се користити директно кроз VectorDrawable, што елиминише потребу за вишеструким растерским копијама.
Често постављана питања
px — физички пиксел екрана. dp (density-independent pixel) — логичка јединица Android-а, једнака 1 px на екрану са густином 160 dpi. При различитим густинама dp се аутоматски конвертује у различит број px, чувајући физичку величину елемента.
Зато што px не узима у обзир густину екрана. Елемент величине 100 px ће изгледати другачије на уређајима са различитим PPI: на екрану 326 PPI биће већи него на 460 PPI. Логичке јединице (dp, pt, sp) решавају овај проблем аутоматски.
PPI (pixels per inch) — број пиксела по инчу дисплеја. Израчунава се по формули: PPI = √(w² + h²) / d, где су w и h — резолуција у px, d — дијагонала у инчима. Што је PPI већи, слика је оштрија. Apple Retina дисплеј почиње од 300 PPI.
px је оправдан при раду са растерским баферима: креирање Bitmap, рендеровање у Canvas, програмирање Metal/OpenGL схадера, обрада слика са камере. У layout-у и типографији px се не користи — примењују се pt (iOS), dp и sp (Android).
У iOS-у: UIScreen.main.nativeBounds враћа величину у px. У Android-у: DisplayMetrics.widthPixels и heightPixels из context.resources.displayMetrics. У SwiftUI-ју: GeometryReader враћа величину у pt, за px је потребно помножити са displayScale.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође