所以UI适配的第一条就是:
1. 使用dp代替px来编写布局。
又因为上面无法适配的个别场景,所以UI适配的第二条是:
2.尽量使用自动适配布局,而不要指定分辨率
这一条也很好理解,尽量使用ConstraintLayout
约束布局和LinearLayout
等父布局,不要写死分辨率,比如上面的例子如果使用match_parent
而不是360dp
,也可以避免出现显示不一致问题(但是仅限于上列)。
限定符
Google同样意识到dp满足所以业务场景的需要,所以提供了宽度限定符的概念。
虽然您的布局应始终通过拉伸其视图内部和周围的空间来应对不同的屏幕尺寸,但这可能无法针对每种屏幕尺寸提供最佳用户体验。例如,您为手机设计的界面或许无法在平板电脑上提供良好的体验。因此,您的应用还应提供备用布局资源,以针对特定屏幕尺寸优化界面设计。
最小宽度限定符
使用“最小宽度”屏幕尺寸限定符,您可以为具有最小宽度(以密度无关像素 dp 或 dip 为度量单位)的屏幕提供备用布局。
通过将屏幕尺寸描述为密度无关像素的度量值,Android 允许您创建专为非常具体的屏幕尺寸而设计的布局,同时让您不必对不同的像素密度有任何担心。
通俗一点翻译就是:可用通过xxxx-swXXXdp的方式定义一些最小限定符的资源文件,比如:values-sw400dp、values-sw600dp,系统会自动匹配如屏幕宽度相近资源文件夹。
我们再来看上面的例子两台设备A和B,分辨率是1920x1080,dpi分别为360和400。我们简化下问题比如设计图给的是1920x1080 360dpi,包含一个22.5px * 22.5px = 10dp * 10dp的图片。按经验布局应该如下编写:
<ImageView
android:id="@+id/img_iv"
android:layout_width="10dp"
android:layout_height="10dp"
android:background="@mipmap/ic_launcher"/>
在不同设备上运行的结果:
- 1280 x 720 240dpi的设备,图片显示为15px * 15px;
- 1920 x1080 360dpi的A设备,图片显示为22.5px