1. 课程导入
在 Android 应用开发中,屏幕旋转与分辨率适配是绕不开的基础能力。用户可能把手机横过来看视频,也可能在平板上分屏使用应用,还可能把折叠屏展开成近似方形的大屏。如果应用没有处理好这些变化,轻则界面错位、文字被裁切,重则 Activity 重建导致数据丢失、崩溃率上升。本课程将围绕“旋转”和“适配”两条主线,从系统机制讲到工程实践,帮助你建立一套可复用的适配方法论。
一、学习目标
完成本课程后,你应当能够独立完成以下任务:
- 理解 Android 屏幕旋转的触发条件、配置变更流程与 Activity 生命周期变化。
- 掌握
android:configChanges、onConfigurationChanged、ViewModel与SavedStateHandle的配合使用。 - 能够区分 dp、dip、sp、px、dpi、density 等单位的适用场景,并正确换算。
- 掌握限定符资源目录(如
layout-sw600dp、values-land)的组织方式。 - 能够使用 ConstraintLayout、FlexboxLayout、Jetpack Compose 自适应布局应对多尺寸屏幕。
- 具备排查旋转崩溃、布局错位、图片拉伸等问题的能力。
核心判断:适配不是“把界面写死成某个尺寸”,而是让界面在不同约束条件下都能保持可读、可点、可理解。旋转只是约束变化的一种,分辨率、密度、字体缩放、分屏、折叠屏同样属于适配范畴。
二、核心概念
在进入具体技术之前,先厘清几个高频概念。它们贯穿整个课程,也是面试和实际开发中经常被追问的点。
| 概念 | 含义 | 典型用途 |
|---|---|---|
| px | 物理像素,屏幕最小显示单位 | 底层绘制、Bitmap 尺寸 |
| dp / dip | 密度无关像素,1dp 约等于 160dpi 下的 1px | 布局宽高、间距、控件尺寸 |
| sp | 缩放无关像素,会随系统字体大小变化 | 文字大小 |
| dpi | 每英寸像素数,描述屏幕密度 | 资源目录划分、图片选择 |
| density | 密度比值,density = dpi / 160 | dp 与 px 换算 |
| Configuration | 系统当前配置,包含方向、尺寸、语言、密度等 | 触发配置变更与资源重载 |
| 限定符 | 资源目录后缀,如 land、sw600dp、xhdpi | 按条件加载不同资源 |
其中最容易混淆的是 dp 与 sp。简单记忆:布局用 dp,文字用 sp。如果文字用 dp,用户调大系统字体后文字不会变大,可访问性会变差;如果布局用 sp,用户调大字体后间距会被异常放大,界面容易错乱。
// dp 与 px 换算
float density = getResources().getDisplayMetrics().density;
int px = (int) (dp * density + 0.5f);
int dp = (int) (px / density + 0.5f);
// sp 与 px 换算
float scaledDensity = getResources().getDisplayMetrics().scaledDensity;
int px = (int) (sp * scaledDensity + 0.5f);
三、整体框架:旋转与适配的关系
很多初学者把“屏幕旋转”和“分辨率适配”当成两个独立问题,实际上它们是同一条链路上的不同环节。旋转会改变屏幕方向,方向变化会触发 Configuration 变更,Configuration 变更又会导致资源重新匹配和 Activity 重建,最终表现为布局、图片、文字、状态的一系列变化。下面这张图展示了从用户旋转设备到界面重新呈现的完整链路。
从图中可以看到,旋转只是触发条件,真正决定适配效果的是资源匹配、状态保存和绘制策略。课程后续章节会沿着这条链路逐层展开:先讲旋转机制,再讲单位与资源,然后讲布局与图片适配,最后讲多设备形态和工程化方案。
四、典型场景与常见误区
先看一个真实场景。某视频应用在手机上横屏播放正常,但在平板上旋转后播放器被拉伸变形,控制栏跑到了屏幕外。排查后发现三个问题:播放器宽高使用了固定 px;控制栏布局只写了 layout/activity_player.xml,没有提供 layout-land;播放进度保存在 Activity 成员变量中,旋转重建后进度归零。这三个问题分别对应布局、资源和状态三个层面,也是本课程要解决的核心问题。
常见误区一:认为设置了 android:configChanges="orientation|screenSize" 就万事大吉。实际上声明后 Activity 不重建,但你需要手动处理所有资源变化,漏掉任何一项都可能导致界面错乱。
常见误区二:把所有尺寸都写成固定 dp。在 6 英寸手机和 12 英寸平板上,固定 dp 的布局要么太挤,要么太空。
常见误区三:只提供一套图片资源。高密度屏幕会拉伸低分辨率图片,低密度屏幕加载高分辨率图片又会浪费内存。
学习建议:每学完一个知识点,就在自己的项目中找一个对应场景动手改一遍。适配问题非常依赖“看到效果”,只看不练很难形成直觉。建议准备一台手机模拟器和一台平板模拟器,随时切换横竖屏验证。
五、课程结构速览
本课程共 30 章,整体分为五个模块:
- 基础认知模块:旋转机制、生命周期、Configuration、单位体系。
- 资源适配模块:限定符目录、drawable 适配、9-patch、矢量图、字体缩放。
- 布局适配模块:ConstraintLayout、Flexbox、Compose 自适应、分屏与折叠屏。
- 状态与数据模块:ViewModel、SavedStateHandle、配置变更下的数据保持。
- 工程实践模块:多设备测试、适配检查清单、性能与崩溃排查、真实项目复盘。
你可以把这张框架图当作学习地图:遇到问题时先判断它属于哪一层,再回到对应章节查找方法。旋转与适配并不神秘,它本质上是一套“感知变化、匹配资源、保持状态、验证效果”的工程习惯。接下来,我们从屏幕旋转的底层机制开始。