屏幕适配
1、布局适配
Android 设备的形状和尺寸多种多样,因此应用的布局需要十分灵活。也就是说,布局应该从容应对不同的屏幕尺寸和方向,而不是为布局定义刚性尺寸,假定屏幕尺寸和宽高比是一定的。
1.1、ConstraintLayout
要创建适用于不同屏幕尺寸的自适应布局,最佳做法就是将 ConstraintLayout 用作界面中的基本布局。使用 ConstraintLayout,您可以根据布局中视图之间的空间关系来指定每个视图的位置和大小。通过这种方式,当屏幕尺寸改变时,所有视图都可以一起移动和拉伸。
1.2、备用布局
values/layout是必须的,主要布局都放在这里。对于一些不常用的屏幕,可以单独写一个布局进行适配,放在不同的layout-文件夹中。
通过创建额外的 res/layout/ 目录来提供特定于屏幕的布局(针对需要不同布局的每种屏幕配置创建一个),然后将屏幕配置限定符附加到 layout 目录名称(例如,对于可用宽度为 600dp 的屏幕,附加限定符 layout-w600dp;例如,对于屏幕高度至少为 600dp 的屏幕,使用限定符 layout-h600dp。)。
实际证明此种方法只适用于Activity加载布局,当其它应用通过反射等方式加载第三方应用的布局View时,是不会选择合适的layout。
2、资源适配
2.1、资源备用
dpi范围 | 密度 |
0dpi ~ 120dpi | ldpi |
120dpi ~ 160dpi | mdpi |
160dpi ~ 240dpi | hdpi |
240dpi ~ 320dpi | xhdpi |
320dpi ~ 480dpi | xxhdpi |
480dpi ~ 640dpi | xxxhdpi |
缩放倍数:以mdpi为基准,drawable-mdpi:drawable-hdpi:drawable-xhdpi:drawable-xxhdpi:drawable-xxxhdpi = 1 : 1.5 :2 : 3 :4 ; 即dpi范围的最大值之比。
密度 | 建议尺寸 |
drawable-mdpi | 48 * 48 |
drawable-hdpi | 72 * 72 |
drawable-xhdpi | 96 * 96 |
drawable-xxhdpi | 144 * 144 |
drawable-xxxhdpi | 192 * 192 |
1.2、改用矢量图形
除了创建多个特定于密度的图片版本之外,另一种方法是仅创建一个矢量图形。在借助矢量图形创建图片时,使用 XML 定义路径和颜色,而不是使用像素位图。因此,矢量图形可以缩放到任何尺寸而不会出现缩放失真,不过它们通常最适合图标等插图,而不太适合照片。
矢量图形通常以 SVG(可缩放矢量图形)文件的形式提供,但 Android 不支持此格式,因此您必须将 SVG 文件转换为 Android 的矢量图格式。
让GUI提供SVG,或者自己自定义shape形状也是不错的选择,不必每种分辨率类型的都提供一张资源。参考Android自定义背景样式Shape
3、Android资源命名规则
为了适配不同屏幕大小的android手机或android平板,有时候就需要利用限定符来为不同的屏幕设定不同的布局文件。android中一些常用的限定符如下所示:
| 屏幕特性 | 限定符 | 描述 |
|---|---|---|
| 屏幕尺寸 | small | 小屏幕 |
| normal | 基准屏幕 | |
| large | 大屏幕 | |
| xlarge | 超大屏幕 | |
| 屏幕密度 | ldpi | <=120dpi |
| mdpi | <= 160dpi | |
| hdpi | <= 240dpi | |
| xhdpi | <= 320dpi | |
| xxhdpi | <= 480dpi | |
| xxhdpi | <= 640dpi(只用来存放icon) | |
| nodpi | 与屏幕密度无关的资源.系统不会针对屏幕密度对其中资源进行压缩或者拉伸 | |
| tvdpi | 介于mdpi与hdpi之间,特定针对213dpi,专门为电视准备的,手机应用开发不需要关心这个密度值. | |
| 屏幕方向 | land | 横向 |
| port | 纵向 | |
| 屏幕宽高比 | long | 比标准屏幕宽高比明显的高或者宽的这样屏幕 |
| notlong | 和标准屏幕配置一样的屏幕宽高比 |

