# RandomLayout

> Sin distribución automática — posicionamiento manual (setBounds) o relativo (setRelativeBounds).

Source: https://crossfly.dev/es/docs/ui/layouts/random-layout — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# RandomLayout

No distribuye nada automáticamente: cada hijo necesita bounds. Es el **layout por defecto** cuando
llamas a `add(...)` sin definir un layout. A pesar del nombre, es la base de **overlays y cards flotantes**.

> 🔴 · **Paquete:** `dev.crossfly.ui.layout` · **Extiende:** `Layout`

## Cuándo usar
- Overlays, cards flotantes, posicionamiento libre.
- Layouts personalizados donde tú controlas los bounds.

## Cuándo NO usar
- Pantallas normales → usa un layout que distribuya (Vertical/Horizontal/Grid).

## `add(...)`
```java
public Layout add(Object... params);   // solo recoge los componentes; no los posiciona
```

## Dos formas de posicionar
1. **Manual (píxeles — NO responsivo):** `filho.setBounds(x, y, w, h)`.
2. **Relativo (responsivo — recomendado):** `filho.setRelativeBounds(Relative x, Relative y, Relative w, Relative h)`.
   El `doLayout()` de `RandomLayout` llama a `Relative.setBounds(c)` automáticamente para todo hijo con
   bounds relativos.

## Ejemplo completo (copiar, pegar y ejecutar)
```java
package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.graphics.*;

/** Pantalla principal ejecutable. Apunta el launcher (classname) y corre: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();

      // La propia Window usa RandomLayout por defecto (sin setLayout)
      Component card = new Component();
      card.setLayout(new VerticalLayout(Position.START, Position.START));
      card.add(LAY_AUTO, new Label("Cartão flutuante"));
      card.setRelativeBounds(
         Relative.CENTER,                            // x: centrado
         Relative.CENTER,                            // y: centrado
         Relative.ofScreen(0.8f, ScreenSize.MIN),   // ancho: 80% del lado menor
         Relative.ofFont(10f)                       // altura: 10 líneas de fuente
      );
      add(card);                                     // RandomLayout resuelve los bounds relativos
   }
}
```

> Los fragmentos siguientes muestran **solo el núcleo** (lo que va dentro de `onShow()`). Para ejecutar, colócalos en el esqueleto `MainWindow` anterior.

## Uso básico (card centrado responsivo)
```java
Component overlay = new Component();          // sin setLayout → RandomLayout
Component card = new Component();
card.setRelativeBounds(
   Relative.CENTER,                            // x: centrado
   Relative.CENTER,                            // y: centrado
   Relative.ofScreen(0.8f, ScreenSize.MIN),   // ancho: 80% del lado menor
   Relative.ofFont(10f)                       // altura: 10 líneas de fuente
);
overlay.add(card);                             // RandomLayout resuelve los bounds relativos
```

## Buenas prácticas
- **Prefiere `setRelativeBounds`** a `setBounds` — mantiene la responsividad.
- Si **necesitas** `setBounds` fijo, recalcula en `Window.onReposition()` (llamado en el resize).

## Errores comunes
- Usar `setBounds(x,y,w,h)` fijo y que la UI se rompa en otra pantalla/densidad.
- Olvidar que sin bounds (ni fijos, ni relativos) el hijo queda en `(0,0)` con tamaño 0.

## Ver también
- [Responsividad](/docs/ui/layouts/responsiveness) · [RelativeLayout](/docs/ui/layouts/relative-layout)
