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
 - 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:

 Chuyển đổi từ dp sang px:

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
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens= "true"
android:anyDensity="true"
/>
- 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



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.
- 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


values-sw720dp          10.1 tablet 1280x800 mdpi

values-sw600dp          7.0  tablet 1024x600 mdpi

values-sw480dp          5.4  480x854 mdpi 
values-sw480dp          5.1  480x800 mdpi 

values-xxhdpi           5.5"  1080x1920 xxhdpi
values-xxhdpi           5.5"  1440x2560 xxhdpi

values-xhdpi            4.7   1280x720 xhdpi 
values-xhdpi            4.65  720x1280 xhdpi 

values-hdpi             4.0 480x800 hdpi
values-hdpi             3.7 480x854 hdpi

values-mdpi             3.2 320x480 mdpi

values-ldpi             3.4 240x432 ldpi
values-ldpi             3.3 240x400 ldpi
values-ldpi             2.7 240x320 ldpi
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
<Sưu tầm>

--- 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

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
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

Bài đăng phổ biến từ blog này

Android - Date Time - Lấy giá trị ngày, giờ theo định dạng tùy biến trong Android Studio

Android - Image - Take Photo, Choose Photo from Gallery - Xử lý chụp ảnh, lấy ảnh trong Android Studio

Android - Circle Image - Tạo ảnh bo tròn trong Android Studio