Responsive Design é uma abordagem para construir interfaces onde o layout se adapta automaticamente ao tamanho, orientação e tipo do dispositivo. No desenvolvimento mobile, o responsive design é implementado através de size classes no iOS e configuration qualifiers no Android. Este artigo aborda os princípios do layout adaptativo, as ferramentas de ambas as plataformas e exemplos de código.
Pontos principais
Responsive Design é um método de construir interfaces onde o layout reage ao tamanho da tela, orientação e espaço disponível, reorganizando os elementos sem perder funcionalidade. O termo foi cunhado por Ethan Marcotte em 2010 para design web, mas os princípios são totalmente aplicáveis a aplicativos nativos mobile.
No desenvolvimento mobile, responsive design significa que o mesmo aplicativo é exibido corretamente em todos os dispositivos: do iPhone SE (375 pt) ao iPad Pro (1024 pt em retrato) e de smartphones Android (360 dp) a tablets (800 dp). Os elementos-chave são grade flexível, imagens adaptativas e media queries em nível de framework (size classes, qualifiers).
De acordo com a documentação da Apple Developer, um aplicativo deve ser universal — funcionando em todos os dispositivos sem uma compilação separada para iPad. O Google Play recomenda usar layouts adaptativos via Jetpack WindowManager e canonical layouts. A falta de adaptação para tablets é uma causa comum de avaliações negativas.
Os termos responsive e adaptive são frequentemente confundidos, embora descrevam abordagens diferentes. Responsive design usa uma grade flexível que se ajusta continuamente à largura da tela. Adaptive design usa layouts fixos para breakpoints predefinidos — o aplicativo alterna entre eles abruptamente.
| Característica | Responsive Design | Adaptive Design |
|---|---|---|
| Abordagem | Fluxo contínuo | Alternância discreta |
| Grade | Percentual, fluida | Fixa por breakpoint |
| Implementação | Auto Layout, Flexbox, ConstraintLayout | Size Classes, layout-w600dp, storyboards separados |
| Número de layouts | Um, mas flexível | Múltiplos (retrato, paisagem, tablet) |
Na prática, aplicativos mobile usam uma combinação de ambas as abordagens. A grade base é construída como responsive (Auto Layout com dependências de constraint), e ao atingir um breakpoint (ex.: largura > 600 pt), o layout muda para uma versão adaptativa com outra disposição de elementos. iOS combina Auto Layout (responsive) com Size Classes (adaptive). Android combina ConstraintLayout (responsive) com recursos qualifier (adaptive).
Size Classes é um mecanismo do iOS que classifica o espaço disponível da tela em dois eixos: horizontal e vertical. Cada eixo pode ser Compact (C) ou Regular (R). A combinação dá quatro opções de adaptação: CR (iPhone retrato típico), RR (iPad retrato/paisagem), RC (iPhone paisagem no Plus/Pro Max), CC (iPad Split View).
// Definindo Size Classes em Swift
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 — mostrar master-detail
case (.compact, .regular):
showStackedView() // iPhone retrato — layout de pilha
case (.compact, .compact):
showCompactView() // iPhone SE paisagem — minimizado
default:
showDefaultView()
}
}
private func showSplitView() {
// Usando UISplitViewController ou HStack
}
private func showStackedView() {
// Pilha vertical para iPhone
}
private func showCompactView() {
// Ocultar elementos secundários, mostrar os principais
}
}No Interface Builder, as Size Classes são configuradas através do painel “wAny hAny” — o desenvolvedor seleciona uma combinação específica (wRegular hRegular, wCompact hRegular) e adiciona variações de constraint. SwiftUI usa @Environment(\.horizontalSizeClass) e @Environment(\.verticalSizeClass) para adaptação reativa — ao mudar a orientação ou o tamanho da janela, SwiftUI redesenha a view automaticamente.
// Size Classes no SwiftUI
import SwiftUI
struct ResponsiveView: View {
@Environment(\.horizontalSizeClass) private var hSizeClass
var body: some View {
if hSizeClass == .regular {
// iPad — layout horizontal com painel lateral
HStack {
SidebarView()
.frame(width: 300)
ContentView()
}
} else {
// iPhone — pilha vertical em tela cheia
VStack {
ContentView()
}
}
}
}Configuration Qualifiers é um mecanismo do Android para carregar diferentes recursos (layout, values, drawables) de acordo com as características do dispositivo. Os qualifiers incluem tamanho de tela (small, normal, large, xlarge), orientação (port, land), largura mínima (sw
// Determinação da configuração do dispositivo em 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()
}
}
}Estrutura de recursos para diferentes telas: res/layout/activity_main.xml (telefone), res/layout-sw600dp/activity_main.xml (tablet 7”), res/layout-sw720dp/activity_main.xml (tablet 10”). O Android seleciona automaticamente o layout correto baseado no smallestWidth — a largura mínima da tela em dp independentemente da orientação. O qualifier sw
// Jetpack Compose — WindowSizeClass para adaptação
@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 (biblioteca androidx.window) fornece WindowSizeClass com três categorias de largura: COMPACT (0–600 dp), MEDIUM (600–840 dp), EXPANDED (>840 dp). Esta é uma alternativa moderna às pastas qualifier antigas. É recomendada pelo Google para adaptação a dispositivos dobráveis e tablets.
A grade adaptativa é a base do responsive design. Em vez de tamanhos fixos, os elementos usam proporções percentuais, constraints flexíveis e tamanho intrínseco do conteúdo. Breakpoints são pontos de largura da tela nos quais o layout alterna entre estados.
| Breakpoint | Size Class iOS | Qualifier Android | Tipo de dispositivo |
|---|---|---|---|
| 0–374 pt / dp | Compact width | — | iPhone SE, Android antigos |
| 375–599 pt / dp | Compact width | sw320dp | iPhone 14, Galaxy S24 |
| 600–839 pt / dp | Regular width | sw600dp | iPad mini, tablets 7” |
| 840+ pt / dp | Regular width | sw720dp | iPad Pro, tablets 10” |
Breakpoints recomendados pelo Google Material Design e Apple HIG: 0–599 dp (telefone, uma coluna), 600–839 dp (tablet, duas colunas, navigation rail), 840+ dp (tablet, três colunas, navigation drawer). O número de breakpoints não deve exceder 4 — pontos de transição excessivos complicam a manutenção e os testes.
Um responsive design bem-sucedido requer seguir um conjunto de regras desenvolvidas pela comunidade de desenvolvedores iOS e Android na última década. Abaixo estão as recomendações principais baseadas no Apple HIG, Google Material Design e experiência em projetos de produção.
O princípio principal do design adaptativo: o conteúdo determina o layout, não o contrário. Se o iPad exibe a mesma pilha de cartões que o iPhone, apenas esticada — isso não é responsive design. Responsive design repensa a composição: no iPhone — rolagem vertical, no iPad — master-detail com painel lateral.
Perguntas frequentes
Responsive Design usa uma grade flexível que se ajusta suavemente à largura da tela. Adaptive Layout alterna entre layouts fixos nos breakpoints. Na prática, ambas as abordagens são combinadas: grade base responsive + alternâncias adaptativas para mudanças importantes (telefone vs tablet).
O iOS usa dois eixos: horizontal (Compact/Regular) e vertical (Compact/Regular). iPhone em retrato — Compact width, Regular height (CR). iPad — Regular width, Regular height (RR). iPhone Plus/Pro Max em paisagem — Regular width, Compact height (RC). O desenvolvedor define variações de constraint para cada combinação.
sw600dp (smallestWidth 600 dp) é um qualifier de recursos do Android que significa que a largura mínima da tela do dispositivo é de pelo menos 600 dp. É usado para carregar layouts alternativos para tablets (7” e maiores). A orientação não importa — sw considera o lado menor da tela.
No iOS, use o simulador com diferentes Size Classes e Preview no SwiftUI com dispositivos de vários tamanhos. No Android, use perfis de dispositivo no emulador (Pixel 5, Pixel C, Galaxy Tab) e Layout Validation no Android Studio. Em ambas as plataformas, teste em um iPad/tablet Android físico e em um dispositivo dobrável.
Canonical layouts são padrões de composição adaptativa prontos do Google Material Design 3: list-detail (lista + detalhe), feed (feed de cartões), supporting pane (conteúdo principal + painel de ações). Cada padrão tem três variantes (compact/medium/expanded) e se adapta automaticamente ao WindowSizeClass.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também