为什么需要屏幕适配?
手机型号 | 屏幕分辨率 | 屏幕密度 | 实际屏幕宽(dp) |
---|---|---|---|
华为Mate9 | 1080*1920 | 440 | 393 |
荣耀6 | 1080*1920 | 460 | 375 |
坚果Pro | 1080*1920 | 480 | 360 |
设计图 | 1080*1920 | - | 375 |
注:在每英寸160点的显示屏上,1dp = 1px,即px = dp(dpi / 160),根据公式可以获得屏幕的实际宽高。
注:1080*1920这个尺寸的手机很长一段时间被作为标准屏幕尺寸。
注:像素密度是屏幕单位面积内的像素数,称为 dpi(每英寸的点数)。 它与分辨率不同,后者是屏幕上的总像素数。
适配的原因就在于实际屏幕宽度。Google的建议,编写UI时,使用dp(密度无关像素 )的方式硬编码。如设计图100dp宽的屏幕放两个50dp宽的元素是完美的;110dp宽的屏幕放下去会有间隙这已经脱离了设计稿的初衷;90dp宽的屏幕第二个元素已经在窗口之外的区域了。
什么是dp?有何作用?
dp(密度无关像素 )是一个虚拟像素单位,1 dp 约等于中密度屏幕(160dpi;“基准”密度)上的 1 像素。对于其他每个密度,Android 会将此值转换为相应的实际像素数。
注:sp 单位与 dp 大小相同,但它会根据用户的首选文本大小来调整大小。

dp解决的是“密度独立性”,如果应用在不同像素密度的屏幕上显示(如图所示),且保留界面设计的物理尺寸(从用户角度来看),则说明其实现了“密度独立性”。保持密度独立性很重要,因为如果不这样,界面元素(例如按钮)在低密度屏幕上显示时可能会变大,在高密度屏幕上显示时则可能会变小(这是因为当像素较大时,单位长度内的像素数较少,如图所示)。
所以dp并不能解决实际屏幕宽度造成的适配问题,只是解决了用户在不同屏幕上看到的同一个元素相对于手机屏幕来说大小一样。
如何解决屏幕宽度造成的适配问题?
头条适配方案
当前设备屏幕总宽度(px)/ 设计图总宽度(dp) = 头条Density
元素宽度 = 头条Density*元素设计宽度(dp)我们一般适配大部分情况下都是宽度上去适配,这里假设UI设计给我们一张360dp(宽)的设计图,那么我们如果要适配所有屏幕,则头条Density = 设备屏幕的真实宽度(单位:px) / 360,这样我们的1dp在所有设备屏幕的宽中所占的比例都是一样的,为1/360。即得,元素宽度 = 头条Density*元素设计宽度(dp)通过这个比例反向获得元素应该设置的宽度。
关于位图的使用
密度限定符 | 说明 |
---|---|
ldpi | 适用于低密度 (ldpi) 屏幕 (~ 120dpi) 的资源。 |
mdpi | 适用于中密度 (mdpi) 屏幕 (~ 160dpi) 的资源(这是基准密度)。 |
hdpi | 适用于高密度 (hdpi) 屏幕 (~ 240dpi) 的资源。 |
xhdpi | 适用于加高 (xhdpi) 密度屏幕 (~ 320dpi) 的资源。 |
xxhdpi | 适用于超超高密度 (xxhdpi) 屏幕 (~ 480dpi) 的资源。 |
xxxhdpi | 适用于超超超高密度 (xxxhdpi) 屏幕 (~ 640dpi) 的资源。 |
nodpi | 适用于所有密度的资源。这些是与密度无关的资源。无论当前屏幕的密度是多少,系统都不会缩放以此限定符标记的资源。 |
tvdpi | 适用于密度介于 mdpi 和 hdpi 之间的屏幕(约 213dpi)的资源。这不属于“主要”密度组。它主要用于电视,而大多数应用都不需要它。对于大多数应用而言,提供 mdpi 和 hdpi 资源便已足够,系统将视情况对其进行缩放。如果您发现有必要提供 tvdpi 资源,应按一个系数来确定其大小,即 1.33*mdpi。例如,如果某张图片在 mdpi 屏幕上的大小为 100px x 100px,那么它在 tvdpi 屏幕上的大小应该为 133px x 133px。 |
注:要针对不同的密度创建备用可绘制位图资源,应遵循六种主要密度之间的 3:4:6:8:12:16 缩放比。如果没有为某个密度提供特定于密度的资源,那么系统会选取下一个最佳匹配项并对其进行缩放以适合屏幕。官方文档
- 36x36 (0.75x) - 低密度 (ldpi)
- 48x48(1.0x 基准)- 中密度 (mdpi)
- 72x72 (1.5x) - 高密度 (hdpi)
- 96x96 (2.0x) - 超高密度 (xhdpi)
- 144x144 (3.0x) - 超超高密度 (xxhdpi)
- 192x192 (4.0x) - 超超超高密度 (xxxhdpi)
mipmap与drawable目录不同,所有 mipmap 目录都会保留在 APK 中,即使您构建特定于密度的 APK 也是如此。这样,启动器应用便可选取要显示在主屏幕上的最佳分辨率图标。某些应用启动器显示的应用图标会比设备的密度级别所要求的大差不多 25%,当把启动图标放在drawable中在xxhdpi的设设备上会放大drawable-xxhdpi中的启动图标,就会显得模糊。应将所有应用图标都放在 mipmap 目录中,而不是放在 drawable 目录中。
例如,如果设备的密度级别为 xxhdpi 且您提供的最大应用图标在 drawable-xxhdpi 中,那么启动器应用会放大此图标,这会使其看起来不太清晰。因此,应在 mipmap-xxxhdpi 目录中提供一个密度更高的启动器图标,而后启动器便可改用 xxxhdpi 资源。
关于SVG也可以很好的增强UI的适配
网友评论