Android từ cơ bản cho đến nâng cao - Supporting Multiple Screens (p1)
Xin chào các bạn, thân là một lập trình viên Android, mình đã gặp khá nhiều trường hợp(kể cả mình) không đào sâu nghiên cứu chi tiết các thành phần trong Android, chỉ biết sử dụng nhưng không hiểu nguyên lý, cách vận hành của nó(giống mình lun :D ). Nên nhân đây mình sẽ làm một loạt bài viết giới ...
Xin chào các bạn, thân là một lập trình viên Android, mình đã gặp khá nhiều trường hợp(kể cả mình) không đào sâu nghiên cứu chi tiết các thành phần trong Android, chỉ biết sử dụng nhưng không hiểu nguyên lý, cách vận hành của nó(giống mình lun :D ). Nên nhân đây mình sẽ làm một loạt bài viết giới thiệu các thành phần của Android và đào sâu vào ngõ ngách của từng thành phần. Cố gắng đặt ra càng nhiều vấn đề càng tốt và sẽ cùng nhau tìm hướng giải quyết nhé :)
Bài đầu tiên trong loạt bài viết về Android sẽ là : Supporting Multiple Screens - Làm sao để xây dựng ứng dụng Android chạy trên nhiều loại devices (tablet, mobile etc).
Theo mình nghĩ phần này khá quan trọng trong khi phát triển một ứng dụng Android nhưng bị một số lập trình viên Android non trẻ(như mình) và cả lập trình viên Android có kinh nghiệm thường bỏ qua(lại giống mình nữa mặc dù mình không phải là lập trình viên có kinh nghiệm :( ).
Để xây dựng một ứng dụng Android không phải đơn giản, nếu bạn đã từng thiết kế cho các ứng dụng iPhone, bạn sẽ cần phải làm nhiều hơn trên Android để hỗ trợ được tất cả các màn hình.
Vậy trước tiên mình cần có một số khái niệm cần phải nắm cho rõ (Rất có ích cho các bạn đi phỏng vấn xin việc nhé)
Các đơn vị đo có thể được sử dụng trong lập trình Android là:
- Pixel - px : chúng ta hay gọi là điểm ảnh, có dạng hình vuông Một hình ảnh bitmap mà bạn thấy trên màn hình là ma trận hai chiều (2D) của các pixel tạo nên (hay ma trận của các hình vuông nhỏ). Mỗi pixel chiếm 1 vị trí trong ma trận và chứa 1 phần của hình ảnh hiển thị. Mỗi pixel chứa 1 màu duy nhất được phối hợp từ 3 màu cơ bản Red, Green, Blue. Pixel thường được dùng để nói về độ phân giải (resolution) của thiết bị. Số lượng điểm ảnh này phụ thuộc vào kích cỡ màn hình và độ phân giải (resolusion) của màn hình đó. Kích thước của một điểm ảnh cũng phụ thuộc vào kích thước màn hình và độ phân giải khác nhau thì không giống nhau. Không có câu trả lời cụ thể cho câu hỏi Một điểm ảnh to bằng từng nào? Nói cách khác, điểm ảnh không có kích thước cụ thể.
- inch là đơn vị đo được sử dụng thông dung ở nước ngoài, tuy nhiên ở Việt Nam thì đa số sử dụng đơn vị đo cm tương đương với inch. inch thường được sử dụng để chỉ kích thước màn hình máy tính, tivi, điện thoại. Vậy 1 inch bằng bao nhiêu cm? 1 inch =2,54 cm = 25,4 mm = 0,0254 mét
- dp hay dip: Density-independent Pixels – Đây là một đơn vị đo chiều dài vật lý cũng giống như inch, cm, mm. Đơn vị này được lấy làm chuẩn trên màn hình 160dpi (Dots per inch), nghĩa là, 1dp sẽ tương đương với 1px trên màn hình có kích thước 160dpi. Khi chạy trên màn hình có mật độ màn hình (Screen Density – tính bằng dpi) lớn hơn, số pixel dùng để vẽ nên 1dp sẽ tỉ lệ với với kích thước dpi của màn hình. Tương tự như vậy với màn hình có mật độ màn hình nhỏ hơn. Tỉ lệ giữa dp và px sẽ thay đổi tùy vào các loại màn hình khác nhau, nhưng không nhất thiết lúc nào cũng tỉ lệ thuận. 160 dp = 1 inch –> điều này có nghĩa 1dp = 1/160 = 0.00625 inch Lưu ý : 1 dp có thể chứa 1 hay nhiều pixel.
- sp: Scale-independent Pixels – Đơn vị này tương đương với đơn vị dp đã nói ở trên, nhưng sẽ được thay đổi tùy vào kích thước font chữ của người dùng. Đây là đơn vị mà Google khuyên dùng để tùy chỉnh kích thước font chữ. Với đơn vị này, kích thước của font chữ sẽ được điều chỉnh dựa vào 3 điều kiện: Tùy chỉnh của lập trình viên, mật độ màn hình và thiết lập kích thước font mặc định của thiết bị.Bạn cần ghi nhớ, 1SP = 1DP, đơn vị này được cung cấp bởi hệ điều hành và hoàn toàn có thể tùy chỉnh.
- Mật độ màn hình (Screen density) : là số điểm ảnh (pixels) trên 1 inch của màn hình thiết bị, thường là 1 inch của màn hình thiết bị Còn được gọi là dpi (dots per inch)
+DPI (Dots per inch hay PPI – Pixels per inch) : nôm na là bạn nhỏ 500 giọt mực trên một inch vuông (500dpi).
Lưu ý dp hay dip không được nhầm lẫn với dpi (dots per inch). Dots per inch là số điểm ảnh (pixels) trên 1 inch của màn hình thiết bị, con số này càng lớn thì màn hình thiết bị hiển thị hình ảnh càng mịn và đẹp.
Dựa vào dpi người ta chia làm loại màn hình như sau:
- ldpi (low) ~120dpi
- mdpi (medium) ~160dpi
- hdpi (high) ~240dpi
- xhdpi (extra-high) ~320dpi
- xxhdpi (extra-extra-high) ~480dpi
- xxxhdpi (extra-extra-extra-high) ~640dpi
Với mỗi loại này thì 1 dp tương ứng với số lượng pixels khác nhau, được tính theo công thức:
px = dp * (dpi / 160)
Ví dụ với thiết bị có dpi là 320 thì với 10 dp ta có: 10 * (320/160) = 20 px, 1 dp tương đương 2 px.
+pt: Point – 1/72 của Inch, dựa vào kích thước vật lý của màn hình.
+mm: Millimet – Dựa vào kích thước vật lý của màn hình
Bonus: Định dạng ảnh 9.patch : Định dạng này có thể nói ngắn gọn như sau, các pixel màu đen bên trái cho phép hình ảnh của bạn có thể co dãn theo chiều ngang, pixel màu đen bên trên cho phép bạn co dãn theo chiều dọc. Pixel bên phải và dưới đáy sẽ là nơi hiển thị nội dung trên ảnh đó. Bạn có thể sử dụng Simple Nine-patch Generator để tạo ra các định dạng ảnh này.
Tạm vậy đã nha. Nhiều quá chắc các bạn cũng nhác đọc :D Phần sau sẽ bắt đầu đi vào sâu về những cách để support nhiều màn hình trên Android. Mong các bạn đón đọc :D
P/s : Bài viết có sự tham khảo từ rất nhiều nguồn trên mạng, có thể giúp cho các bạn đỡ phải Google lắt nhắt tìm hiểu. Xin cảm ơn :)
Các bạn có thể tham khảo một số bài viết nữa của mình tại đây nhé :
WebRTC basic – Phần 1: Tìm hiểu về NAT, STUN, TURN vs ICE
WebRTC basic phần 2 : Cách thiết lập một cuộc gọi thông qua WebRTC