Android - Multiple Screens - Differrent Screen Sizes Xử lýdmàn hình khác nhau trên Android
1. Tìm hiểu về các đơn vị tính kích thước trong Android
Chuyển đổi từ dp sang px:
- px: pixel - điểm ảnh - đơn vị cho độ phân giải của màn hình thiết bị(độ phân giải không phụ thuộc vào kích thước vật lý của màn hình, kích thước vật lý màn hình tính theo đơn vị inch)
- dp: đơn vị đo độ dài của Google được sử dụng trong lập trình Android
- dpi: số pixel trên một inch.
px= dp*(dpi/160)
- Dựa vào công thức ta có phương thức chuyển đổi giữa px và dp:
public static float convertDpToPx(float dp,Context context){
Resources resources =
context.getResources();
DisplayMetrics metrics =
resources.getDisplayMetrics();
float px = dp * (metrics.densityDpi/160f);
return px;
}
Chuyển đổi từ px sang dp:
public static float convertPxToDp(float px,Context context){
Resources resources =
context.getResources();
DisplayMetrics metrics =
resources.getDisplayMetrics();
float dp = px / (metrics.densityDpi / 160f);
return dp;
}
2. Xử lý đa màn hình
Các bước thực hiện:
- Khai báo trong AndroidManifest.xml
- See more at: http://www.tothenew.com/blog/handle-multiple-screen-sizes-in-android/#sthash.8RwfXn5r.dpuf
- Tạo thư mục layout và xml tương ứng cho từng loại kích thước màn hình
- See more at: http://www.tothenew.com/blog/handle-multiple-screen-sizes-in-android/#sthash.8RwfXn5r.dpuf
- Tạo drawable.xml, dimens.xml,mipmap tương ứng cho từng kích thước màn hình
--- cập nhật tiếp trong ngày mai
Các bước thực hiện:
- Khai báo trong AndroidManifest.xml
<
supports-screens
android:smallScreens
=
"true"
android:normalScreens
=
"true"
android:largeScreens
=
"true"
android:anyDensity
=
"true"
/>
- Tạo thư mục layout và xml tương ứng cho từng loại kích thước màn hình
As we design our UI for different screen sizes, we’ll discover that each design requires a minimum amount of space. So, each generalized screen size above has an associated minimum resolution that’s defined by the system. These minimum sizes are in “dp” units.
1
2
3
4
5
| res/layout/my_layout.xml // layout for normal screen size ("default") res/layout-small/my_layout.xml // layout for small screen size res/layout-large/my_layout.xml // layout for large screen size res/layout-xlarge/my_layout.xml // layout for extra large screen size res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation |
We can also define it on the basis of dp like -
res/layout/main_activity.xml // For handsets res/layout-sw600dp/main_activity.xml // For 7” tablets(600x1024 mdpi).600dp wide and bigger. res/layout-sw720dp/main_activity.xml // For 10” tablets (720x1280 mdpi).720dp wide and bigger. |
- Tạo drawable.xml, dimens.xml,mipmap tương ứng cho từng kích thước màn hình
|
13. Đa màn hình trong Android
drawable
- Chỉ
nên chứa nguyên file .xml customview với shape, selector, custom bitmap
- Không
đặt file ảnh có size lớn (Chú ý)
- Không
chứa file animation
- Nếu cần
thiết có thể để file ảnh dạng .9 path nhưng tốt nhất là không nên dùng
drawable-ndpi -- n: l, m, h, x, xx, xxx
drawable-language-ndpi
- Chỉ chứa
file ảnh (hãy đặt chính xác ảnh với độ phân giải tương ứng. VD: icon
launcher hdpi là 72px)
- Với cấu
trúc ngày trước các thư mục này chứa ảnh và .9path, nhưng với cấu trúc hiện
tại nên chỉ chứa nguyên .9path
- Với ứng
dụng yêu cầu cao ở multiscreen thì hãy để tất cả các ảnh với độ phân giải
vào các resource tương ứng
- Với ứng
dụng yêu cầu nhẹ dung lượng mức trung bình: chỉ nên đặt ảnh trong xxhdpi
- Với ứng
dụng yêu cầu nhẹ nhất mà vẫn đảm bảo độ tinh xảo thì đặt ảnh trong hdpi
- Với ứng
dụng yêu cầu nhẹ nhất mà không yêu cầu cao về độ sắc nét để ảnh trogn mdpi
mipmap-ndpi -- n: l, m, h, x, xx, xxx
mipmap-language-ndpi
Hãy tận dụng đặt file ảnh (not .9path) ở đây với độ phân giải
tương ứng
Sẽ khá tốt cho việc multi screen
values-n -- n: l, m, h, x, xx, xxx
values-language-n -- n: l, m, h, x, xx, xxx
Tận dụng việc đặt dimension (dimens.xml) vào trong độ phân
giải tương ứng sẽ giúp ích cho bạn rất nhiều trong việc thiết kế multiscreen
layout|land
raw | animation | color | bitmap...
3.1. Sử dụng dimens
Chú ý quan trọng trong việc sử dụng
- Không
sử dụng trực tiếp dimens trong xml, custom shape (10dp, 20dp, ...., 14sp,
16sp, ...) có thể khai báo với dimens nhỏ: 0.4dp, 0.8dp
- Hãy cố
gắng khai báo trong dimens tương ứng (hay dùng: phone - values-hdpi tablet
- values-large-mdpi) và gọi trong resource
- Với
dip có độ lớn lẻ hạn chế sử dụng nên quy đổi về dạng chẵn hoặc 2^n: 16,
32, 48, 64, 72, 96, 114, 196
- Nếu
giá trị nằm giữa các khoảng nên dùng 1 số bội nhiều lần của 2: 24, 36, 48
**Chú ý: **
- Hạn chế
sử ảnh làm background, nếu có thể sử dụng custom shape thay thế thì hãy cố
gắng dùng nó, tốc độ load ứng dụng sẽ nhanh hơn rất nhiều
3.2.Nguyên tắc thiết kế
- Không
nên đặt id trùng nhau giữa các layout (chắc chắn là không được trùng trong
1 layout rồi)
- Với
XML phức tạp hãy cố gắng làm đơn giản nó
Ví dụ: Left: textView - Right: Checkbox
Như bình thường các bạn phải sử dụng 2 views: TextView và CheckBox thì thay vì thế chỉ cần sử dụng nguyên TextView hoặc CheckBox là đủ và sử dụng thêm thuộc tính: drawableLeft | drawableRight - Với
Group View được sử dụng lại nhiều lần trong layout. Bạn có thể custom nó
thành file nhỏ -> Load lên Java code -> Customize -> Sử dụng lại
trong layout. Việc này rất hiệu quả trong cách thiết kế XML nó làm giảm số
lượng View và cải thiện tốc độ load ngoài ra còn đẹp code
- Với những
View , hoặc group view có size lớn một phần nào đó của màn hình, những
view cân đối 2 bên hãy sử dụng weight | layout_weight (đừng
nên dùng size nhé) sẽ cực kỳ hiệu quả cho multi screen, multi device
- Hạn chế
sử dụng độ sâu của View: LinearLayout ->
RelativeLayout->LinearLayout->View hay kiểu tương tự, nếu các bạn có
thể rút ngắn về độ sâu thì hãy làm nó
- Với những
View gần tương tự như nhau hãy thiết kế 1 cái chung nhỏ nhất để sử dụng lại
nó (include)
- Chú
ý 1: Việc thiết kế layout bội (layout nhiều nhất của 2 layout) xong khi sử
dụng cái nào không cần thì gone đi -> Việc đó nên cực kỳ hạn chế, nó sẽ
làm cho bạn không quản lý được view và load chậm
- Chú
ý 2: Với view phức tạp nên phân tích kỹ trước khi bắt tay vào code
--- cập nhật tiếp trong ngày mai
https://developer.android.com/training/multiscreen/screendensities.html
https://developer.android.com/training/multiscreen/index.html
https://developer.android.com/guide/practices/screens_support.html
http://www.tothenew.com/blog/handle-multiple-screen-sizes-in-android/
https://www.raywenderlich.com/114066/adaptive-ui-android-tutorial
http://developer.samsung.com/technical-doc/view.do;jsessionid=CAB1E0721D0414D1AFCE234B0253867C?v=T000000100
http://mrbool.com/how-to-handle-multiple-screen-sizes-in-android/31291
http://www.vanteon.com/downloads/Scaling_Android_Apps_White_Paper.pdf
https://stuff.mit.edu/afs/sipb/project/android/docs/guide/practices/screens_support.html#DeclaringTabletLayouts
https://stuff.mit.edu/afs/sipb/project/android/docs/guide/practices/screens_support.html
https://developer.android.com/training/multiscreen/index.html
https://developer.android.com/guide/practices/screens_support.html
http://www.tothenew.com/blog/handle-multiple-screen-sizes-in-android/
https://www.raywenderlich.com/114066/adaptive-ui-android-tutorial
http://developer.samsung.com/technical-doc/view.do;jsessionid=CAB1E0721D0414D1AFCE234B0253867C?v=T000000100
http://mrbool.com/how-to-handle-multiple-screen-sizes-in-android/31291
http://www.vanteon.com/downloads/Scaling_Android_Apps_White_Paper.pdf
https://stuff.mit.edu/afs/sipb/project/android/docs/guide/practices/screens_support.html#DeclaringTabletLayouts
https://stuff.mit.edu/afs/sipb/project/android/docs/guide/practices/screens_support.html
http://www.tothenew.com/blog/handle-multiple-screen-sizes-in-android/
https://developer.android.com/training/multiscreen/screensizes.html
https://developer.android.com/guide/practices/screens_support.html#qualifiers
https://developer.android.com/guide/practices/screens_support.html#DeclaringTabletLayouts
https://developer.android.com/training/multiscreen/screensizes.html
https://developer.android.com/guide/practices/screens_support.html#qualifiers
https://developer.android.com/guide/practices/screens_support.html#DeclaringTabletLayouts
http://blog.co-mit.com/post/62/%5BAndroid%5D+Nh%E1%BB%AFng+nguy%C3%AAn+t%E1%BA%AFc+v%C3%A0+kinh+nghi%E1%BB%87m+g%E1%BB%A1+r%E1%BB%91i+c%C3%A1c+v%E1%BA%A5n+%C4%91%E1%BB%81+khi+d%E1%BB%B1ng+layout+trong+Android
Nhận xét
Đăng nhận xét