Android-UI屏幕适配全攻略

2018-01-31  本文已影响78人  FDoubleman

Android 可在各种具有不同屏幕尺寸和密度的设备上运行,实际开发中常常会被要求:一个app能在不同型号手机上使用,同时保证不会出现UI显示不全、UI显示失真等情况。本文主要介绍了Android常见的屏幕适配问题。

一、屏幕适配概览


本节概述 Android 对多种屏幕的支持,
包括:术语和概念、支持的屏幕范围、密度独立性

术语和概念

屏幕尺寸
    按屏幕对角测量的实际物理尺寸。
    为简便起见,Android 将所有实际屏幕尺寸分组为四种通用尺寸:小、 正常、大和超大。

屏幕密度
    屏幕物理区域中的像素量;通常称为 dpi(每英寸 点数)。例如, 与“正常”或“高”密度屏幕相比,“低”密度屏幕在给定物理区域的像素较少。
    为简便起见,Android 将所有屏幕密度分组为六种通用密度: 低、中、高、超高、超超高和超超超高。

方向
    从用户视角看屏幕的方向,即横屏还是 竖屏,分别表示屏幕的纵横比是宽还是高。请注意, 不仅不同的设备默认以不同的方向操作,而且 方向在运行时可随着用户旋转设备而改变。

分辨率
    屏幕上物理像素的总数。添加对多种屏幕的支持时, 应用不会直接使用分辨率;而只应关注通用尺寸和密度组指定的屏幕 尺寸及密度。

密度无关像素 (dp)
    在定义 UI 布局时应使用的虚拟像素单位,用于以密度无关方式表示布局维度 或位置。
    密度无关像素等于 160 dpi 屏幕上的一个物理像素,这是 系统为“中”密度屏幕假设的基线密度。在运行时,系统 根据使用中屏幕的实际密度按需要以透明方式处理 dp 单位的任何缩放 。dp 单位转换为屏幕像素很简单: px = dp * (dpi / 160)。 例如,在 240 dpi 屏幕上,1 dp 等于 1.5 物理像素。在定义应用的 UI 时应始终使用 dp 单位 ,以确保在不同密度的屏幕上正常显示 UI。

支持的屏幕范围

从 Android 1.6(API 级别 4)开始,Android 支持多种屏幕尺寸和密度,反映设备可能具有的多种不同屏幕配置。

为简化您为多种屏幕设计用户界面的方式,Android 将实际屏幕尺寸和密度的范围 分为:

  1. 四种通用尺寸:小、正常、 大 和超大
    • 从 Android 3.2(API 级别 13)开始,这些尺寸组 已弃用,
      2.六种通用的密度:
    • ldpi(低)~120dpi
    • mdpi(中)~160dpi
    • hdpi(高)~240dpi
    • xhdpi(超高)~320dpi
    • xxhdpi(超超高)~480dpi
    • xxxhdpi(超超超高)~640dpi(别笑 google就是这么定义的-.-//)

    通用的尺寸和密度按照基线配置(即正常尺寸和 mdpi(中)密度)排列。每种通用的尺寸和密度都涵盖一个实际屏幕尺寸和密度范围。例如, 两部都报告正常屏幕尺寸的设备在手动测量时,实际屏幕尺寸和 高宽比可能略有不同。类似地,对于两台报告 hdpi 屏幕密度的设备,其实际像素密度可能略有不同。 Android 将这些差异抽象概括到应用,使您可以提供为通用尺寸和密度设计的 UI,让系统按需要处理任何最终调整。

    图 1 说明不同的尺寸和密度如何粗略归类为不同的尺寸 和密度组。

说明 Android 如何将实际尺寸和密度粗略地 对应到通用的尺寸和密度(数据并不精确)。

密度独立性

    应用显示在密度不同的屏幕上时,如果它保持用户界面元素的物理尺寸(从 用户的视角),便可实现“密度独立性”

    保持密度独立性很重要,因为如果没有此功能,UI 元素(例如 按钮)在低密度屏幕上看起来较大,在高密度屏幕上看起来较小。这些 密度相关的大小变化可能给应用布局和易用性带来问题。
    图 2 和 3 分别显示了应用不提供密度独立性和 提供密度独立性时的差异。

图 2. 不支持不同密度的示例应用在低、中、高密度屏幕上的显示情况。
图 3. 良好支持不同密度(密度独立)的示例应用在低、中、高密度屏幕上的显示情况。

Android 系统可帮助您的应用以两种方式实现密度独立性:

在图 2 中,文本视图和位图可绘制对象具有以像素(px 单位)指定的尺寸,因此视图的物理尺寸在低密度屏幕上更大,在高密度 屏幕上更小。这是因为,虽然实际屏幕尺寸可能相同,但高密度屏幕 的每英寸像素更多(同样多的像素在一个更小的区域内)。在图 3 中,布局 尺寸以密度独立的像素(dp 单位)指定。由于 密度独立像素的基线是中密度屏幕,因此具有中密度屏幕的设备看起来 与图 2 一样。但对于低密度和高密度屏幕,系统 将分别增加和减少密度独立像素值,以适应 屏幕。

    大多数情况下,确保应用中的屏幕独立性很简单,只需以适当的密度独立像素(dp 单位)或 "wrap_content" 指定所有 布局尺寸值。系统然后根据适用于当前屏幕密度的缩放比例适当地缩放位图可绘制对象,以 适当的大小显示。

    但位图缩放可能导致模糊或像素化位图,您或许已经在上面的屏幕截图中 发现了这些问题。为避免这些伪影,应为 不同的密度提供替代的位图资源。例如,应为高密度 屏幕提供分辨率较高的位图,然后系统对中密度 屏幕将使用这些位图,而无需调整位图大小。下一节详细说明如何为 不同的屏幕配置提供备用资源。

二、如何支持多种屏幕


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

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

注:将您的所有启动器图标放在 res/mipmap-[density]/ 文件夹中,而非 res/drawable-[density]/ 文件夹中,仅当要在 xxhdpi 设备上提供比正常位图大的启动器图标时才需要提供 mipmap-xxxhdpi 限定符。无需为所有应用的图像提供 xxxhdpi 资源。

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

使用配置限定符

设计替代布局和可绘制对象

三、最佳做法


支持多种屏幕的目标是创建一款在 Android 系统支持的通用屏幕尺寸上都可以 正常运行且显示良好的应用。本文档 前面各节内容介绍了 Android 系统如何使您的 应用适应屏幕配置,以及如何在不同的 屏幕配置上自定义应用的外观。本节提供另外一些提示以及有助于 确保应用针对不同屏幕配置正确缩放的 技巧概览。

1. 在 XML 布局文件中指定尺寸时使用 wrap_content、match_parent 或 dp 单位 。
    为 XML 布局文件中的视图定义 android:layout_widthandroid:layout_height 时,使用 "wrap_content""match_parent"dp 单位可确保在当前设备屏幕上为 视图提供适当的尺寸。

    例如,layout_width="100dp" 的视图在 中密度屏幕上测出宽度为 100 像素,在高密度屏幕上系统会将其扩展至 150 像素宽, 因此视图在屏幕上占用的物理空间大约相同。

    类似地,您应选择 sp(缩放独立的像素)来定义文本 大小。sp 缩放系数取决于用户设置,系统 会像处理 dp 一样缩放大小。

2. 不要在应用代码中使用硬编码的像素值
    由于性能的原因和简化代码的需要,Android 系统使用像素作为 表示尺寸或坐标值的标准单位。这意味着, 视图的尺寸在代码中始终以像素表示,但始终基于当前的屏幕密度。 例如,如果 myView.getWidth() 返回 10,则表示视图在 当前屏幕上为 10 像素宽,但在更高密度的屏幕上,返回的值可能是 15。如果 在应用代码中使用像素值来处理预先未针对 当前屏幕密度缩放的位图,您可能需要缩放代码中使用的像素值,以与 未缩放的位图来源匹配。
3. 不要使用 AbsoluteLayout(已弃用)
[AbsoluteLayout] 在 Android 1.5(API 级别 3)上便已弃用。

您应改用 [RelativeLayout],它会使用相对定位 来放置其子视图

4. 为不同屏幕密度提供替代位图可绘制对象
    虽然系统会根据当前屏幕 配置扩展布局,但您在不同的屏幕尺寸上可能要调整 UI,以及提供 针对不同密度优化的可绘制对象。

    如果需要精确控制应用在不同 屏幕配置上的外观,请在配置特定的 资源目录中调整您的布局和位图可绘制对象。例如,考虑要显示在 中密度和高密度屏幕上的图标。只需创建两种不同大小的图标 (例如中密度使用 100x100,高密度使用 150x150),然后使用适当的限定符 以适当的方向放置两个 变体:

res/drawable-mdpi/icon.png //for medium-density screens
res/drawable-hdpi/icon.png //for high-density screens

上一篇下一篇

猜你喜欢

热点阅读