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 пъти по-голяма, тъй като коефициентът на мащабиране е 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 елементът ще бъде твърде малък, а на ниско 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 кофа | Коефициент | Пример (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, толкова по-остро е изображението. Retina дисплеят на Apple започва от 300 PPI.
px е оправдано при работа с растерни буфери: създаване на Bitmap, рендиране в Canvas, програмиране на Metal/OpenGL шейдъри, обработка на изображения от камера. В оформление и типография 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също