px — một pixel vật lý, phần tử nhỏ nhất của hình ảnh trên màn hình thiết bị. Trong phát triển di động, px được sử dụng làm đơn vị cơ bản của độ phân giải màn hình và mật độ pixel (PPI), nhưng thực tế không được sử dụng cho bố cục giao diện — thay vào đó, các đơn vị logic pt, dp và sp được sử dụng. Bài viết này giải thích px khác với đơn vị logic như thế nào, độ phân giải và PPI liên quan ra sao, và tại sao sử dụng px trực tiếp trong code là một phản mẫu.
Những điểm chính
px (pixel, phần tử hình ảnh) — phần tử có thể định địa chỉ nhỏ nhất của hình ảnh raster hoặc màn hình. Mỗi pixel lưu trữ thông tin màu sắc trong mô hình RGB (đỏ, lục, lam) với độ sâu màu từ 8 đến 10 bit trên mỗi kênh. Màn hình của các thiết bị di động hiện đại chứa hàng triệu pixel: iPhone 15 Pro — 3 triệu, iPad Pro 12.9" — 5,6 triệu pixel.
Kích thước vật lý của pixel phụ thuộc vào mật độ màn hình (PPI). Trên thiết bị 326 PPI (iPhone 11), một pixel có kích thước khoảng 0,078 mm. Trên màn hình 460 PPI (iPhone 15 Pro) — 0,055 mm. Kích thước vật lý của pixel càng nhỏ thì độ sắc nét của hình ảnh càng cao. Đồng thời, mật độ pixel ảnh hưởng trực tiếp đến hiệu suất kết xuất: nhiều pixel hơn = nhiều việc hơn cho GPU.
Theo Apple, độ phân giải màn hình của iPhone 15 Pro là 1179 × 2556 px ở 460 PPI. Để so sánh, iPhone SE (thế hệ thứ 3) — 750 × 1334 px ở 326 PPI. Sự khác biệt về tổng số pixel là gần 3 lần, điều này giải thích yêu cầu GPU cao hơn trên các mẫu Pro.
Độ phân giải màn hình — số lượng pixel vật lý theo chiều ngang và chiều dọc. Nó được viết theo định dạng rộng × cao, ví dụ 1179 × 2556 px. Độ phân giải là một đặc tính cơ bản của màn hình không thể thay đổi bằng phần mềm — nó được cố định ở cấp độ phần cứng và ma trận.
| Thiết bị | Độ phân giải (px) | PPI | Tỷ lệ khung hình |
|---|---|---|---|
| iPhone SE (thế hệ thứ 3) | 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 |
Độ phân giải tính bằng pixel không nên nhầm lẫn với kích thước logic của màn hình (tính bằng pt cho iOS hoặc dp cho Android). Ví dụ, iPhone 14 có kích thước logic 390 × 844 pt, nhưng độ phân giải vật lý là 1170 × 2532 px — lớn hơn chính xác 3 lần, vì hệ số tỷ lệ là 3.
PPI (số pixel trên mỗi inch) — số pixel trên mỗi inch của màn hình. Được tính bằng công thức: PPI = √(rộng² + cao²) / đường chéo. PPI càng cao, các pixel riêng lẻ càng nhỏ và hình ảnh càng mượt. Apple coi màn hình có PPI trên 300 ở khoảng cách xem điển hình là màn hình Retina.
Các loại thiết bị khác nhau có mật độ khác nhau: Apple Watch — 326 PPI, iPhone — 326–460 PPI, iPad — 264 PPI, MacBook Pro — 254–264 PPI. Các thiết bị Android phân loại mật độ thông qua Density Buckets: mdpi (160 dpi), hdpi (240), xhdpi (320), xxhdpi (480), xxxhdpi (640). Các bucket này xác định tài nguyên nào (hình ảnh, dimens) sẽ được tải cho thiết bị.
Tác động của PPI đến phát triển: mật độ càng cao, càng cần nhiều bộ nhớ để lưu trữ kết cấu và hình ảnh. Một pixel trên màn hình 500 PPI yêu cầu bộ nhớ GPU gấp 2,5 lần so với màn hình 320 PPI cho cùng kích thước phần tử logic. Tối ưu hóa nội dung cho các bucket mật độ cụ thể là một thực hành tiêu chuẩn trong phát triển Android.
Pixel vật lý (px) khác với đơn vị logic (pt, dp, sp) ở chỗ chúng gắn liền với độ phân giải phần cứng và không được chia tỷ lệ. Ngược lại, đơn vị logic trừu tượng hóa nhà phát triển khỏi màn hình cụ thể, cho phép một giá trị 100 pt hiển thị với cùng kích thước vật lý trên các thiết bị khác nhau.
| Đơn vị | Nền tảng | Phụ thuộc vào PPI | Chia tỷ lệ | Mục đích |
|---|---|---|---|---|
| px | Tất cả | Có (pixel vật lý) | Không | Hình ảnh, bộ đệm, Metal |
| pt | iOS/macOS | Không (điểm logic) | hệ số tỷ lệ | Bố cục, UIKit, SwiftUI |
| dp | Android | Không (độc lập mật độ) | bucket mật độ | Bố cục, kích thước phần tử |
| sp | Android | Không (độc lập tỷ lệ) | mật độ + tỷ lệ phông | Văn bản (textSize) |
Công thức chuyển đổi: cho iOS — px = pt × scale (trong đó scale = 1, 2 hoặc 3). Cho Android — px = dp × (dpi / 160). Sử dụng px trực tiếp trong code có nghĩa là giao diện sẽ trông khác nhau trên các thiết bị có mật độ khác nhau: trên màn hình PPI cao, phần tử sẽ quá nhỏ, còn trên PPI thấp — quá lớn.
Sử dụng px trong mã nguồn của ứng dụng di động là một phản mẫu dẫn đến hiển thị giao diện không chính xác trên các thiết bị có mật độ pixel khác nhau. Các framework hiện đại (UIKit, SwiftUI, Jetpack Compose, XML Layouts) cấm hoặc không khuyến nghị chỉ định kích thước bằng pixel.
Việc sử dụng px hợp pháp duy nhất trong code là làm việc với raster: tải Bitmap, tạo Canvas để kết xuất hình ảnh, làm việc với Metal hoặc OpenGL. Trong những trường hợp này, px là pixel vật lý của bộ đệm đích và phải được tính đến để kết xuất chính xác. Trong tất cả các trường hợp khác, đơn vị logic được sử dụng.
Hình ảnh và biểu tượng được lưu trữ bằng pixel, nhưng các phiên bản khác nhau được cung cấp cho mỗi loại màn hình. iOS sử dụng hậu tố @1x, @2x, @3x trong Assets.xcassets. Android sử dụng các thư mục drawable-mdpi (1×), drawable-hdpi (1.5×), drawable-xhdpi (2×), drawable-xxhdpi (3×), drawable-xxxhdpi (4×). Hệ thống tự động chọn tệp chính xác dựa trên mật độ màn hình.
| Tỷ lệ iOS | Bucket Android | Hệ số | Ví dụ (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 |
Quy tắc cung cấp nội dung: tạo hình ảnh ở định dạng vector (PDF, SVG) và xuất sang các bản sao raster có kích thước cần thiết. Nội dung vector có thể chia tỷ lệ mà không giảm chất lượng và chiếm ít dung lượng hơn trong kho lưu trữ. Trong Android, tài nguyên vector có thể được sử dụng trực tiếp thông qua VectorDrawable, loại bỏ nhu cầu về nhiều bản sao raster.
Câu hỏi thường gặp
px — một pixel vật lý của màn hình. dp (pixel độc lập mật độ) — một đơn vị logic Android bằng 1 px trên màn hình có mật độ 160 dpi. Ở các mật độ khác nhau, dp tự động chuyển đổi thành số lượng px khác nhau, giữ nguyên kích thước vật lý của phần tử.
Bởi vì px không tính đến mật độ màn hình. Một phần tử 100 px sẽ trông khác nhau trên các thiết bị có PPI khác nhau: trên màn hình 326 PPI, nó sẽ lớn hơn trên 460 PPI. Các đơn vị logic (dp, pt, sp) giải quyết vấn đề này một cách tự động.
PPI (số pixel trên mỗi inch) — số pixel trên mỗi inch của màn hình. Được tính bằng công thức: PPI = √(r² + c²) / d, trong đó r và c là độ phân giải tính bằng px, d là đường chéo tính bằng inch. PPI càng cao, hình ảnh càng sắc nét. Màn hình Retina của Apple bắt đầu từ 300 PPI.
px hợp lý khi làm việc với bộ đệm raster: tạo Bitmap, kết xuất trong Canvas, lập trình shader Metal/OpenGL, xử lý hình ảnh từ camera. Trong bố cục và kiểu chữ, px không được sử dụng — pt (iOS), dp và sp (Android) được áp dụng.
Trong iOS: UIScreen.main.nativeBounds trả về kích thước bằng px. Trong Android: DisplayMetrics.widthPixels và heightPixels từ context.resources.displayMetrics. Trong SwiftUI: GeometryReader trả về kích thước bằng pt, để có px cần nhân với displayScale.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm