Esta página fue traducida automáticamente del portugués y puede contener errores. La versión en portugués es la canónica.
Cómo colocar un badge en la esquina de un avatar
Propósito. Superponer un pequeño “badge” (contador de notificaciones, punto de estado)
anclado a una esquina de otro componente (avatar, icono). Usa el RelativeLayout, que
posiciona a los hijos mediante anclajes relativos a otro hijo.
APIs usadas
new RelativeLayout()— layout que posiciona por anclajesRelPosy dimensiona porRelSize.layout.add(Component target, RelPos x, RelPos y, RelSize w, RelSize h, Component relative)— añadetargetposicionado relativo arelative.RelPos.END_OF— alinea el borde final (derecho) del badge con el borde final del avatar.RelPos.START— alinea la parte superior del badge con la parte superior del avatar (anclaje vertical START).RelSize.AUTOSIZE— el badge usa su propio tamaño preferido (ancho y alto).container.setLayout(layout)— instala elRelativeLayouten el contenedor.
Verificación importante: en la fuente, los valores del enum son
RelSize.AUTOSIZE(noAUTO),RelSize.FILL,RelSize.FIT,RelSize.SAMESIZE,RelSize.KEEPSIZE; yRelPos.END_OF,RelPos.START,RelPos.AFTER,RelPos.CENTER_OFetc.
Ejemplo completo (copiar, pegar y ejecutar)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
/** 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();
setLayout(new VerticalLayout());
// Componentes de ejemplo: un "avatar" y un "badge" contador
Component avatar = new Component().style(Styles.component().backColor(0xFFCCCCCC));
Component badge = new Label("3").style(Styles.component().backColor(0xFFFF3B30).textColor(0xFFFFFFFF));
// Container que contiene avatar + badge
Component container = new Component().style(Styles.transparent());
RelativeLayout rl = new RelativeLayout();
// 1) El avatar: anclado en la esquina superior izquierda, tamaño automático
rl.add(avatar, RelPos.START, RelPos.START, RelSize.AUTOSIZE, RelSize.AUTOSIZE);
// 2) El badge: esquina superior derecha DEL AVATAR (END_OF en x, START en y),
// tamaño propio. El último argumento (avatar) es la referencia.
rl.add(badge, RelPos.END_OF, RelPos.START, RelSize.AUTOSIZE, RelSize.AUTOSIZE, avatar);
container.setLayout(rl);
add(container);
}
}
El fragmento de abajo muestra solo el núcleo. Para ejecutarlo, colócalo en el esqueleto
MainWindowde arriba.
Fragmento mínimo
// Container que contiene avatar + badge
Component container = new Component().style(Styles.transparent());
RelativeLayout rl = new RelativeLayout();
// 1) El avatar: anclado en la esquina superior izquierda, tamaño automático
rl.add(avatar, RelPos.START, RelPos.START, RelSize.AUTOSIZE, RelSize.AUTOSIZE);
// 2) El badge: esquina superior derecha DEL AVATAR (END_OF en x, START en y),
// tamaño propio. El último argumento (avatar) es la referencia.
rl.add(badge, RelPos.END_OF, RelPos.START, RelSize.AUTOSIZE, RelSize.AUTOSIZE, avatar);
container.setLayout(rl);
add(container);
Nota de verificación (código 2026). Confirmado en
RelativeLayout: la firma con referencia explícita esadd(Component, RelPos, RelPos, RelSize, RelSize, Component).END_OFresuelve x como “borde final de la referencia menos el ancho del badge” (el badge toca el lado derecho del avatar);STARTen y alinea a la parte superior. Para desplazar el badge “hacia afuera” de la esquina (efecto clásico de superposición), ajusta eloutgapdel badge — hay una sobrecargaadd(..., Component relative, Gap outgap). Si omites la referencia, el layout usa el componente añadido anteriormente como referencia.
Profundiza
- Card cliqueable (composición con GridLayout): card-clicavel.md