前言
dp 能够让同一数值在不同的分辨率展示出大致相同的尺寸大小。但是当设备的尺寸差异较大的时候,就无能为力了。适配的问题还需要我们自己去做。
常见手机屏幕像素及对应分辨率级别
|密度类型 |代表的分辨率(px)| 屏幕像素密度(dpi) |换算关系 |比例|
| ------------- |:-------------:| -----:|
|低密度(ldpi)| 240320 |120 |1dp=0.75px|3|
|中密度(mdpi)| 320480 |160| 1dp=1.0px| 4
|高密度(hdpi) |480800| 240 |1dp=1.5px |6
|超高密度(xhdpi) |7201280| 320| 1dp=2.0px| 8
|超超高密度(xxhdpi) |1080*1920| 480| 1dp=3.0px |12|
适配的tips:
- 多用match_parent
- 在LinearLayout 中多用weight,在RelativeLayout多用位置关系
- 自定义view解决
- 尽量不要给控件的宽高写死
- 使用Size限定符,在不同条件下加载不同的布局
- 使用Smallest-width限定符
使用Size限定符有一个问题会让很多程序员感到头疼,large到底是指多大呢?很多应用程序都希望能够更自由地为不同屏幕设备加载不同的布局,不管它们是不是被系统认定为"large"。这就是Android为什么在3.2以后引入了"Smallest-width"限定符。
Smallest-width限定符允许你设定一个具体的最小值(以dp为单位)来指定屏幕。例如,7寸的平板最小宽度是600dp,所以如果你想让你的UI在这种屏幕上显示two pane,在更小的屏幕上显示single pane,你可以使用sw600dp来表示你想在600dp以上宽度的屏幕上使用two pane模式。
- 使用布局别名
Smallest-width限定符仅在Android 3.2及之后的系统中有效。因而,你也需要同时使用Size限定符(small, normal, large和xlarge)来兼容更早的系统。例如,你想手机上显示single-pane界面,而在7寸平板和更大屏的设备上显示multi-pane界面. - 使用Orientation限定符
有些布局会在横屏和竖屏的情况下都显示的很好,但是多数情况下这些布局都可以再调整的。比如横竖的布局不一样。
res/values-sw600dp-land/layouts.xml:
res/values-sw600dp-port/layouts.xml:
- 使用Nine-Patch图片
支持不同屏幕大小通常情况下也意味着,你的图片资源也需要有自适应的能力
参考资料
- HongYang Android 屏幕适配方案