Responsive Design — 基础知识,界面适配屏幕

作者: IT Sectr 发布日期: 2026-02-25 阅读时间: 9 分钟

Responsive Design — 一种构建界面的方法,布局会自动适应设备的尺寸、方向和类型。在移动开发中,responsive design 通过 iOS 中的 size classes 和 Android 中的 configuration qualifiers 实现。本文讨论了自适应布局的原理、两个平台的工具和代码示例。

要点

  • Responsive Design — 界面适应不同屏幕尺寸、方向和设备类型
  • Size Classes — iOS 机制,用于在水平和垂直方向上确定紧凑或常规尺寸
  • Configuration Qualifiers — 用于不同屏幕配置的 Android 资源(layout-w600dp, values-sw600dp)
  • 自适应网格 — 在屏幕宽度变化时重新排列元素,而不仅仅是拉伸
  • Breakpoints — 布局状态之间的过渡点(例如 iPhone 375 pt,iPad 768 pt)

什么是 Responsive Design?

Responsive Design — 一种构建界面的方法,布局对屏幕尺寸、方向和可用空间做出反应,在不损失功能的情况下重新排列元素的位置。该术语由 Ethan Marcotte 于 2010 年为网页设计提出,但原理完全适用于原生移动应用程序。

在移动开发中,responsive design 意味着同一个应用程序在所有设备上都能正确显示:从 iPhone SE (375 pt) 到 iPad Pro (1024 pt 竖屏),从 Android 智能手机 (360 dp) 到平板电脑 (800 dp)。关键元素包括 灵活网格 (flexible grid)、自适应图片 和框架级别的 media queries (size classes, qualifiers)。

根据 Apple Developer Documentation,应用程序应该是通用的 — 在所有设备上运行,无需为 iPad 单独编译。Google Play 推荐通过 Jetpack WindowManager 和 canonical layouts 使用 adaptive layouts。缺乏对平板电脑的适配是负面评价的常见原因。

Responsive vs Adaptive Design

Responsiveadaptive 这两个术语经常混淆,尽管它们描述的是不同的方法。Responsive design 使用灵活网格,不断适应屏幕宽度。Adaptive design 为预定义的 breakpoints 使用固定布局 — 应用程序在这些布局之间跳转。

特征Responsive DesignAdaptive Design
方法连续流动离散切换
网格百分比,流体每个 breakpoint 固定
实现Auto Layout, Flexbox, ConstraintLayoutSize Classes, layout-w600dp, 单独的 storyboard
设计布局数量一个,但灵活多个(phone portrait, phone landscape, tablet)

在实践中,移动应用程序结合使用两种方法。基础网格以 responsive 方式构建(Auto Layout 带有约束依赖),当达到 breakpoint(例如宽度 > 600 pt)时,布局切换到具有不同元素组合的自适应版本。iOS 结合了 Auto Layout (responsive) 和 Size Classes (adaptive)。Android 结合了 ConstraintLayout (responsive) 和 qualifier 资源 (adaptive)。

iOS Size Classes: Compact 和 Regular

Size Classes — iOS 机制,将可用屏幕空间按两个轴分类:水平和垂直。每个轴可以是 Compact (C) 或 Regular (R)。组合提供四种布局适应变体:CR(普通 iPhone 竖屏)、RR(iPad 竖屏/横屏)、RC(iPhone 横屏 Plus/Pro Max)、CC(iPad Split View)。

swift
// 在 Swift 中定义 Size Classes
import UIKit

class AdaptiveViewController: UIViewController {

    override func traitCollectionDidChange(
        _ previousTraitCollection: UITraitCollection?
    ) {
        super.traitCollectionDidChange(previousTraitCollection)
        adjustLayout(for: traitCollection)
    }

    private func adjustLayout(for traits: UITraitCollection) {
        switch (traits.horizontalSizeClass, traits.verticalSizeClass) {
        case (.regular, .regular):
            showSplitView() // iPad — 显示 master-detail
        case (.compact, .regular):
            showStackedView() // iPhone 竖屏 — 堆栈布局
        case (.compact, .compact):
            showCompactView() // iPhone SE 横屏 — 最小化
        default:
            showDefaultView()
        }
    }

    private func showSplitView() {
        // 我们使用 UISplitViewController 或 HStack
    }

    private func showStackedView() {
        // iPhone 的垂直堆栈
    }

    private func showCompactView() {
        // 隐藏次要元素,显示主要元素
    }
}

在 Interface Builder 中,Size Classes 通过 “wAny hAny” 面板配置 — 开发人员选择特定组合(wRegular hRegular, wCompact hRegular)并添加约束变体。SwiftUI 使用 @Environment(\.horizontalSizeClass)@Environment(\.verticalSizeClass) 进行响应式适配 — 当方向或窗口大小改变时,SwiftUI 自动重新绘制视图。

swift
// SwiftUI 中的 Size Classes
import SwiftUI

struct ResponsiveView: View {
    @Environment(\.horizontalSizeClass) private var hSizeClass

    var body: some View {
        if hSizeClass == .regular {
            // iPad — 带侧面板的水平布局
            HStack {
                SidebarView()
                    .frame(width: 300)
                ContentView()
            }
        } else {
            // iPhone — 全屏垂直堆栈
            VStack {
                ContentView()
            }
        }
    }
}

Android Configuration Qualifiers

Configuration Qualifiers — Android 机制,根据设备特性加载不同资源(layout, values, drawables)。限定符包括屏幕尺寸(small, normal, large, xlarge)、方向(port, land)、最小宽度(swdp)、可用宽度(wdp)和高度(hdp)。

kotlin
// 在 Kotlin 中定义设备配置
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val config = resources.configuration
        val screenWidthDp = config.screenWidthDp
        val screenHeightDp = config.screenHeightDp
        val orientation = config.orientation

        when {
            screenWidthDp >= 900 -> setContentView(R.layout.activity_main_tablet)
            screenWidthDp >= 600 -> setContentView(R.layout.activity_main_sw600)
            else -> setContentView(R.layout.activity_main_phone)
        }
    }

    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            supportFragmentManager.beginTransaction()
                .replace(R.id.container, LandscapeFragment())
                .commit()
        }
    }
}

不同屏幕的资源结构:res/layout/activity_main.xml(手机)、res/layout-sw600dp/activity_main.xml(7 英寸平板)、res/layout-sw720dp/activity_main.xml(10 英寸平板)。Android 根据 smallestWidth 自动选择正确的布局 — 屏幕在 dp 中的最小宽度,与方向无关。swdp 限定符 — 最稳定的适配方法。

kotlin
// Jetpack Compose — 用于适配的 WindowSizeClass
@Composable
fun ResponsiveScreen() {
    val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass

    when {
        windowSizeClass.windowSizeClass == WindowWidthSizeClass.EXPANDED -> {
            TabletLayout() // >= 840 dp
        }
        windowSizeClass.windowSizeClass == WindowWidthSizeClass.MEDIUM -> {
            MediumLayout() // 600–840 dp
        }
        else -> {
            CompactLayout() // < 600 dp
        }
    }
}

Jetpack WindowManager(androidx.window 库)提供具有三种宽度类别的 WindowSizeClass:COMPACT (0–600 dp)、MEDIUM (600–840 dp)、EXPANDED (>840 dp)。这是旧版 qualifier 文件夹的现代替代方案。Google 推荐用于适配可折叠设备和平板电脑。

自适应网格和 breakpoints

自适应网格是 responsive design 的基础。元素使用百分比比例、灵活约束和 intrinsic content size 而不是固定尺寸。Breakpoints — 屏幕宽度的点,当达到这些点时布局在状态之间切换。

BreakpointiOS Size ClassAndroid Qualifier设备类型
0–374 pt / dpCompact widthiPhone SE, 旧版 Android
375–599 pt / dpCompact widthsw320dpiPhone 14, Galaxy S24
600–839 pt / dpRegular widthsw600dpiPad mini, 7 英寸平板
840+ pt / dpRegular widthsw720dpiPad Pro, 10 英寸平板

Google Material Design 和 Apple HIG 推荐的 breakpoints:0–599 dp(手机,一列)、600–839 dp(平板,两列,navigation rail)、840+ dp(平板,三列,navigation drawer)。Breakpoints 数量不应超过 4 个 — 过多的过渡点会增加维护和测试的复杂性。

自适应设计的最佳实践

成功的 responsive design 需要遵守过去十年来 iOS 和 Android 开发者社区制定的一套规则。以下是基于 Apple HIG、Google Material Design 和实际项目经验的关键建议。

  • 从最小的屏幕开始 — 为 iPhone SE (375 pt) 或 Android compact (360 dp) 设计布局,然后为更大的屏幕添加扩展。这确保了关键内容在任何地方都能容纳
  • 使用 intrinsic content size — UILabel、UIButton、ImageView 具有自然尺寸。Auto Layout 和 ConstraintLayout 使用它进行自动定位,无需不必要的约束
  • 不要在小屏幕上隐藏内容 — 与其隐藏,不如重新排列(reflow)。用户应该能够访问相同的功能,只是顺序不同
  • 在所有 size classes 上测试 — iOS 模拟器允许在不重启的情况下切换 Size Classes。Android 模拟器提供不同的设备配置文件。务必在平板电脑和可折叠设备上进行测试
  • Material 3 Adaptive Layout — Google 提供了用于列表/详情、工具栏和导航的现成 canonical layouts。使用它们而不是发明自己的模式

自适应设计的主要原则:内容决定布局,而不是相反。如果在 iPad 上显示与 iPhone 相同的卡片堆叠,只是横向拉伸 — 这不是 responsive design。Responsive design 重新构思了组合:iPhone 上 — 垂直滚动,iPad 上 — 带侧面板的 master-detail。

常见问题

Responsive Design 和 Adaptive Layout 有什么区别?

Responsive Design 使用灵活网格,逐渐适应屏幕宽度。Adaptive Layout 在 breakpoint 点处切换固定布局。在实践中,两种方法结合使用:responsive 基础网格 + 用于重大更改(手机 vs 平板)的自适应切换。

iOS 中有哪些 Size Classes?

iOS 使用两个轴:水平(Compact/Regular)和垂直(Compact/Regular)。竖屏 iPhone — Compact width, Regular height (CR)。iPad — Regular width, Regular height (RR)。横屏 iPhone Plus/Pro Max — Regular width, Compact height (RC)。开发人员为每种组合设置约束变体。

Android 中的 sw600dp 是什么?

sw600dp (smallestWidth 600 dp) — Android 资源限定符,表示设备的最小屏幕宽度至少为 600 dp。用于为平板电脑(7 英寸及以上)加载替代布局。方向不影响 — sw 考虑屏幕的最小边。

如何测试应用程序的适应性?

在 iOS 上使用具有不同 Size Classes 的模拟器和 SwiftUI 中具有不同尺寸设备的 Preview。在 Android 上 — 模拟器中的设备配置文件(Pixel 5, Pixel C, Galaxy Tab)和 Android Studio 中的 Layout Validation。在两个平台上务必在实体 iPad/Android 平板和可折叠设备上进行测试。

Material Design 中的 canonical layouts 是什么?

Canonical layouts — Google Material Design 3 提供的现成自适应组合模式:list-detail(列表 + 详情)、feed(卡片流)、supporting pane(主要内容 + 操作面板)。每种模式有三个变体(compact/medium/expanded)并自动适应 WindowSizeClass。

总结

  • Responsive Design — 通过灵活网格和 breakpoints 使布局适应屏幕尺寸和方向
  • iOS 中的 Size Classes (Compact/Regular) 确定 iPhone、iPad 和 Split View 的布局
  • Android 中的 Configuration Qualifiers (swdp, wdp, layout-land) 为设备加载资源
  • Jetpack WindowManager 提供具有三个类别的 WindowSizeClass:COMPACT, MEDIUM, EXPANDED
  • Breakpoints:0–599 dp(手机)、600–839 dp(平板)、840+ dp(宽屏平板)
  • Responsive ≠ 简单拉伸 — 需要重新排列元素(reflow),而不是隐藏内容
  • 测试在所有类型的设备上,包括平板电脑和可折叠设备,是开发中强制性的阶段

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读