Responsividade: uma UI para todas as telas
No CrossFly, responsividade não é um recurso à parte — é consequência de medir por relações. Se você seguir os princípios abaixo, a tela se readapta a tamanho, densidade (DPI), escala de fonte e orientação sem media queries e sem recalcular à mão. Esta página é o recorte orientado a tarefa do Capítulo 36; o “porquê” está em Layout e o modelo Relative.
Os 5 princípios
- Nunca posicione em pixels fixos. Use frações,
RelativeeLAY_FILL/LAY_AUTO. - Deixe o layout medir.
LAY_AUTO/Relative.AUTO/RelSize.AUTOSIZEreportam o tamanho natural. - Espaçamento também escala.
ingap/outgapviaGap.ofFont(...), nunca pixels. - Uma área elástica por eixo. Marque um componente com
LAY_FILLpara absorver a sobra. - Resize é automático — se você fez o acima. Só
setBoundsmanual exige código.
A caixa de ferramentas
| Ferramenta | Quando |
|---|---|
Relative.ofFont(x) |
tamanhos que devem escalar com a fonte/DPI (embute densidade e zoom) |
Relative.ofScreen(x[, ScreenSize.MIN]) |
fração da tela; MIN = adapta a portrait/landscape |
LAY_FILL / LAY_AUTO / fração |
dividir o container |
Gap.ofFont(...) |
padding/margem que escalam |
Screen.minSize |
breakpoint estável entre orientações |
Breakpoints com Screen.minSize
Use o menor lado (Screen.minSize), não width — ele é estável quando o aparelho gira:
boolean tablet = Screen.minSize >= 600; // decide 1 vs 2 colunas, por exemplo
Quando (raramente) mudar o arranjo: onReposition()
Se o layout deve mudar de estrutura por orientação, sobrescreva Window.onReposition():
@Override protected void onReposition() throws Exception {
painel.removeAll();
if (Screen.isLandscape) { // 2 colunas
painel.setLayout(new HorizontalLayout());
painel.add(0.5f, lista); painel.add(0.5f, detalhe);
} else { // 1 coluna
painel.setLayout(new VerticalLayout());
painel.add(LAY_FILL, lista); painel.add(LAY_AUTO, detalhe);
}
}
Checklist de responsividade
- Zero
ofPixels/setBoundsfixos (salvo exceção justificada). - Exatamente um
LAY_FILLpor eixo elástico. - Espaçamentos com
Gap.ofFont/ofScreen. - Quadrados/ícones com
ofScreen(v, ScreenSize.MIN). - Breakpoints com
Screen.minSize.
Anti-padrões
| Anti-padrão | Correção |
|---|---|
setBounds(0,0,300,48) |
LAY_AUTO/Relative.ofFont |
Gap.ofPixels(16) fixo |
Gap.ofFont(1f) |
breakpoint por Screen.width |
Screen.minSize |
dois LAY_FILL no mesmo eixo |
um só |
Veja também
- Fonte canônica: Capítulo 36 · Conceito: Layout e Relative
- Layouts · Responsividade (ui)
Esta página foi útil?Obrigado pelo feedback!