一.布局适配建议
1.不要使用绝对布局
2.尽量使用 match_parent 而不是 fill_parent
3.能够使用比重的地方使用比重(layout_weight="1")
4.纯色背景和规则图形使用shape
5.在特定分辨率下通过添加 layout_WxH.xml 如 layout_1800x1080.xml layout_port.xml竖屏 layout_land.xml横屏
二.术语和概念
1.屏幕尺寸:屏幕尺寸也是物理尺寸,常见small, normal, large, xlarge (2.3之后添加的分类)
- small screens are at least 426dp x 320dp
- normal screens are at least 470dp x 320dp
- large screens are at least 640dp x 480dp
- xlarge screens are at least 960dp x 720dp
2.屏幕密度:一定物理区域内的像素的数量,通常简称dpi,每英寸像素数,常见ldpi(low),mdpi(medium),hpdi(high),xhdpi(extra high) (2.2之后添加的分类)
3.一般情况下的普通屏幕:
- A set of six generalized densities:
- ldpi (low) ~120dpi
- mdpi (medium) ~160dpi
- hdpi (high) ~240dpi
- xhdpi (extra-high) ~320dpi
- xxhdpi (extra-extra-high) ~480dpi
- xxxhdpi (extra-extra-extra-high) ~640dpi
该值通过如下方式获取:getResources().getDisplayMetrics().densityDpi
4.方向:屏幕方向,分横和竖
5.分辨率:屏幕上的物理像素总数,
6.密度无关的像素数dp,定义UI布局时使用,可与px换算
7.布局:物理尺寸对应布局,layout-small(小于3寸),layout_normal(4.5英寸左右),layout_large.xml(4-7寸之左右),layout_xlarge(7-10寸左右)
三.适配
1.显示声明:
<supports-screens android:resizeable=["true"| "false"]
android:smallScreens=["true" | "false"]
android:normalScreens=["true" | "false"]
android:largeScreens=["true" | "false"]
android:xlargeScreens=["true" | "false"]
android:anyDensity=["true" | "false"]
android:requiresSmallestWidthDp="integer"
android:compatibleWidthLimitDp="integer"
android:largestWidthLimitDp="integer"/>
2.提供不同尺寸的布局
3.提供不同屏幕密度的图片
4.
To create alternative bitmap drawables for different densities, you should follow the 3:4:6:8:12:16 scaling ratio between the six generalized densities. For example, if you have a bitmap drawable that's 48x48 pixels for medium-density screens, all the different sizes should be:
- 36x36 (0.75x) for low-density
- 48x48 (1.0x baseline) for medium-density
- 72x72 (1.5x) for high-density
- 96x96 (2.0x) for extra-high-density
- 180x180 (3.0x) for extra-extra-high-density
- 192x192 (4.0x) for extra-extra-extra-high-density (launcher icon only; see note above)
To help you target some of your designs for different types of devices, here are some numbers for typical screen widths:
- 320dp: a typical phone screen (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc).
- 480dp: a tweener tablet like the Streak (480x800 mdpi).
- 600dp: a 7” tablet (600x1024 mdpi).
- 720dp: a 10” tablet (720x1280 mdpi, 800x1280 mdpi, etc).
最小宽度 sw<N>dp 屏幕的基本尺寸,是指最短的可用屏幕区域。具体的说,设备的最小宽度是屏幕可用的宽度和高度中最短的那个(也可以把它看做是屏幕的最小可能的宽度)。这样就可以使用这个限定符来确保应用程序至少有<N>dp的宽度可用于UI界面,而不管屏幕的当前方向。
例如,如果布局在任何时候都需要至少600dp的最小屏幕尺寸,那么就能够使用这个限定符,在res/layout-sw600dp/目录中创建布局资源。系统只会在可用屏幕的尺寸至少是600dp的时候才会使用这些资源,而不管600dp是否是被用户认知的高度或宽度。最小宽度是设备的固定屏幕尺寸特征,当屏幕的方向发生改变时,设备的最小宽度不改变。 例如:
sw320dp
sw600dp
sw720dp 等
可用宽度 w<N>dp 指定最小的可用屏幕宽度,在资源中应该以dp为单位来定义<N>的值。当方向在横向和纵向之间改变时,这个配置值会跟当前的实际的宽度相匹配。
例如:
w720dp
w1024dp 等
可用高度 h<N>dp 指定最小的可用屏幕高度,在资源中应该以dp为单位来定义<N>的值,当方向在横向和纵向直接改变时,这个配置值应该跟当前的实际高度匹配。
例如:
h720dp
h1024dp等