Android屏幕适配

源于Android系统的开放性,任何移动终端厂商都可以对Android平台进行定制,所以Android系统会在不同屏幕尺寸和分辨率的设备上运行。
为了保证在所有设备上一致的用户体验,则UI中的某一元素在Android不同尺寸,不同分辨率的手机上具备相同的显示效果
Android系统可以处理大多数工作,为了将applications适用于不同的屏幕,会进行缩放和大小调整,但开发者需要针对不同的屏幕尺寸和分辨率优化应用,这样才可以最大程度的优化所有设备上的用户体验(用户会认为您开发的应用是专为他们的设备而设计,而不是简单地拉伸以适应其设备屏幕)

术语和概念
  1. 屏幕大小(尺寸): Android设备对角线上的物理尺寸(单位:英寸,1英寸=2.54cm)
  2. 分辨率(density):屏幕上物理像素的总数,一般表示横向宽的像素×纵向高的像素值,如1080×1920(px)
  3. 屏幕密度:每英寸的像素点数,通常称为dpi-dots per inch
  4. 密度无关像素(dp–density independent pixel):密度无关像素等于160dpi(mdpi)屏幕上的一个物理像素
  5. 缩放独立的像素(sp):用来定义文本大小,sp缩放系统取决于用户设置,系统会像处理sp一样缩放大小
单位转化
  1. 求解屏幕密度
    dpi=w2+h22size d p i = w 2 + h 2 2 s i z e

size

比如:一台屏幕大小是5寸,分辨率是1080*1920(px)的手机,屏幕密度是

10802+192022522035440dpi 1080 2 + 1920 2 2 5 ≈ 2203 5 ≈ 440 d p i

2. dp与px的转换,求解dp单位转换为屏幕像素:
px=dp×dpi160 p x = d p × d p i 160

在Android中,以160dpi的屏幕密度为基线密度: 1dp=1px ; 则在480dpi的屏幕上,1dp等于3个物理像素
在定义应用的UI时应始终使用dp单位,以确保在不同密度的屏幕上正常显示UI

Android如何支持多种屏幕

Android支持多种屏幕的基础是它能够管理针对当前屏幕配置以适当方式渲染应用的布局和位图可绘制对象。系统可处理大多数工作,通过适当地缩放布局以适应屏幕尺寸/密度和根据屏幕密度缩放位图可绘制对象,在每种屏幕配置中渲染您的应用,为了更适当地处理不同的屏幕配置,开发者还应该:

1. 在manifest中显示声明您的应用支持哪些屏幕尺寸

要声明应用支持的屏幕尺寸,应在清单文件中包含supports-screens 元素。

<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"/>

根据理解,上述属性主要是兼容android3.2之前的版本,目前手机厂商都开始适配android8.0,在产的手机至少也是19以上了,所以基本可以忽略这个的配置属性

2. 为不同屏幕尺寸提供不同的布局

默认情况下,Android会调整应用布局的大小以适应当前设备屏幕。大多数情况下效果很好,但有时UI可能看起来不太好,需要针对不同的屏幕尺寸进行调整。例如,在较大屏幕上,您可能要调整某些元素的位置和大小,以利用其他屏幕空间,或者在较小屏幕上,可能需要调整大小以使所有内容都显示在屏幕上

3. 为不同屏幕密度提供不同的位图可绘制对象

默认情况下,Android会缩放位图可绘制对象(.png,.jpg和.gif文件)和九宫格可绘制对象(.9.png文件),使他们以适当的物理尺寸显示在不同的设备上。例如,如果您的应用只为极限中密度屏幕(mdpi)提供位图可绘制对象,则在高密度屏幕上会增大位图,在低密度屏幕上会缩小位图。
这种缩放可能会在位图中造成伪影。为确保位图的最佳显示效果,应针对不同屏幕密度加入不同分辨率的替代版本
可用于密度特定资源的配置限定符(在下面详述) 包括 ldpi(低)、mdpi(中)、 hdpi(高)、xhdpi(超高)、xxhdpi (超超高)和 xxxhdpi(超超超高)。例如,高密度屏幕的位图应使用 drawable-hdpi/。

注:将您的所有启动器图标放在 res/mipmap-[density]/ 文件夹中,而非 res/drawable-[density]/ 文件夹中。无论安装应用的设备屏幕分辨率如何,Android 系统都会将资源保留在这些密度特定的文件夹中,例如 mipmap-xxxhdpi。此 行为可让启动器应用为您的应用选择要显示在主 屏幕上的最佳分辨率图标。

如需了解有关使用 mipmap 文件夹的详细信息,请参阅管理项目概览

运行时,系统通过以下程序确保任何给定资源在当前屏幕上都能保持尽可能最佳的显示效果:
1. 系统使用适当的备用资源

根据当前屏幕的尺寸和密度,系统将使用您的应用中提供的任何尺寸和密度特定资源。例如如果设备有高密度屏幕(hdpi),并且应用请求可绘制对象资源,系统将查找与设备配置最匹配的可绘制对象资源目录。根据可用的其他备用资源,包含hdpi限定符的资源目录可能是最佳匹配项,因此系统将使用此目录中的可绘制对象资源

2. 如果没有匹配的资源,系统将使用默认资源,并按需要向上或向下扩展,以匹配当前的屏幕尺寸和密度

默认资源是指未标记配置限定符的资源。例如,drawable/中的资源是默认可绘制资源。
当系统查找密度特定的资源但在密度特定目录中未找到时,不一定会使用默认资源。系统在缩放时可能改用其他密度特定资源提供更好的效果

使用配置限定符

Android支持多种配置限定符,可让您控制系统如何根据当前设备屏幕的特性选择备用资源。配置限定符是可以附加到Android项目中资源目录的字符串,用于制定在其中设计资源的配置。

1. 在项目的res/目录中新建一个目录,并使用下面格式命名:-

其中是标准资源名称(例如drawable或layout)
是下面表中的配置限定符,用于制定要使用这些资源的屏幕配置(如:hdpi/xlarge)

2. 将适当的配置特定资源保存在此新目录下。这些资源文件的名称必须与默认资源文件完全一致

例如,xlarge是超大屏幕的配置限定符,将此字符串附加到资源目录名称(layout-xlarge)时,它指向要在具有超大屏幕的设备上使用这些资源的系统
配置限定符

请注意,当 Android 系统在运行时选择使用哪些资源时,它会使用 特定逻辑确定“最佳匹配”资源。也就是说,您使用的限定符无 需在所有情况下精确匹配当前屏幕配置,系统也可 使用它们。特别是,根据屏幕尺寸限定符选择资源时,如果没有更好的匹配资源,则系统将 使用专为小于当前屏幕的屏幕而设计的 资源(例如,如有必要,大尺寸屏幕将使用标准尺寸的屏幕 资源)。但是,如果唯一可用的资源大于当前屏幕, 则系统不会使用这些资源,并且如果没有其他资源与设备 配置匹配,应用将会崩溃(例如,如果所有布局资源均用 xlarge 限定符标记, 但设备是标准尺寸的屏幕)。如需有关系统如何选择资源的更多信息,请参阅Android 如何查找最佳匹配资源

替代可绘制对象

要为不同的密度创建替代位图可绘制对象,应遵循六种通用密度之间的 3:4:6:8:12:16 缩放比率。例如,如果您的 位图可绘制对象是对中密度屏幕使用 48x48 像素,则所有不同的尺寸应为:
- 36x36 (0.75x) 用于低密度
- 48x48(1.0x 基线)用于中密度
- 72x72 (1.5x) 用于高密度
- 96x96 (2.0x) 用于超高密度
- 192x192 (4.0x)用于超超超高密度(仅限启动器图标;请参阅上面的 注)

此文章后面部分的大部分文字来源于支持多种屏幕,更详细的介绍还请参考官方文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值