BarcodePicker
BarcodePicker lê códigos de barras/QR a partir de frames da câmera ao vivo, filtrando por formato. É uma classe abstrata: o consumidor implementa onBarcode(BarcodeFormat format, String code). Segue o padrão dos pickers (ver Picker) — devolve o payload lido via getAnswer().
🔴 · Pacote:
dev.crossfly.ui.picker· Estende:Picker implements GdxCamera.Listener(abstrata) · Hardware: câmera
ℹ️ Este
BarcodePickeré a leitura por câmera e continua existindo. Não confundir com o antigo utilitário de geração de barcode (util/barcode), que foi removido na modernização.
Quando usar
- Escanear códigos de barras (produtos, ingressos) ou QR codes.
Quando NÃO usar
- Tirar foto/gravar vídeo → use
PhotoPicker.
Aparência
Preview de câmera em tela cheia (fundo preto), título no topo, um crosshair vermelho central de mira e um “X” branco de fechar no canto inferior-direito.
Exemplo completo (copiar, colar e rodar)
BarcodePicker é abstrato: instancie-o com um corpo que implemente onBarcode. Como é um overlay de câmera, dispare-o a partir de um Button. O exemplo reutiliza o uso básico (formatos 1D, fecha na 1ª leitura) e escreve o payload num Label. BarcodeFormat vem de com.google.zxing.
package com.exemplo;
import com.google.zxing.BarcodeFormat;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.picker.*;
/** Tela principal executável. Aponte o launcher (classname) e rode: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
Label saida = new Label("Nenhum código lido");
add(LAY_AUTO, saida);
Button escanear = new Button("Escanear código")
.onAction(c ->
{
BarcodePicker scanner = new BarcodePicker("Aponte para o código", BarcodePicker.formats1D)
{
protected void onBarcode(BarcodeFormat format, String code)
{
onUI(() -> saida.setText(format + ": " + code)); // volta à paint thread
hide(); // fecha após a 1ª leitura (não fecha sozinho)
}
};
scanner.show(answer -> {});
});
add(LAY_AUTO, escanear);
}
}
Os trechos abaixo mostram só o miolo (o que vai dentro de
onShow()). Para rodar, coloque-os no esqueletoMainWindowacima.
Uso básico
BarcodePicker scanner = new BarcodePicker("Aponte para o código", BarcodePicker.formats1D)
{
protected void onBarcode(BarcodeFormat format, String code)
{
Debug.log(format + ": " + code);
hide(); // fecha após a 1ª leitura
}
};
scanner.show(answer -> campoCodigo.setText((String) answer));
Construtores
| Construtor | Descrição |
|---|---|
BarcodePicker(String title, BarcodeFormat... formats) |
Título + formatos aceitos (varargs; vazio = todos). Abstrato — instancie com corpo implementando onBarcode. |
Propriedades e personalização
| Membro | Tipo | Default | O que faz |
|---|---|---|---|
BarcodePicker.formats1D (estático) |
BarcodeFormat[] |
— | Conjunto pronto de formatos 1D (CODE_128, EAN_13…). |
BarcodePicker.formats2D (estático) |
BarcodeFormat[] |
— | Conjunto pronto de formatos 2D (QR_CODE). |
BarcodePicker.beep (estático) |
boolean |
true |
Bipa ao decodificar. |
BarcodePicker.vibrate (estático) |
boolean |
true |
Vibra ao decodificar. |
Callbacks e eventos
| Callback | Quando dispara |
|---|---|
onBarcode(BarcodeFormat, String) |
(abstrato) ao decodificar um código do formato aceito. |
show(onAnswer) |
ao fechar, entrega a String do último payload lido. |
getAnswer() retorna o último payload decodificado, ou null se cancelado.
Estados
- Não há
hide()automático ao detectar — quem decide fechar é a suaonBarcode(chamandohide()). Sem isso, o scanner continua lendo (útil para leitura contínua). - Códigos repetidos consecutivos (mesmo
lastCode) são ignorados. onAppPause/onAppResumegerenciam a câmera;onRemovepara a thread de decodificação.
Aceitar apenas QR e fechar na primeira leitura
BarcodePicker scanner = new BarcodePicker("Leia o QR", BarcodePicker.formats2D)
{
protected void onBarcode(BarcodeFormat format, String code)
{
onUI(() -> campoCodigo.setText(code)); // atualização de UI na paint thread
hide();
}
};
scanner.show(answer -> Debug.log("Lido: " + answer));
Boas práticas
- Chame
hide()emonBarcodepara leitura única; omita para leitura contínua. - A decodificação roda em thread de fundo — envolva atualizações de UI em
onUI(...).
Erros comuns
- Esquecer
hide()quando queria leitura única — o scanner continua ativo. - Atualizar UI direto na
onBarcode— respeite a paint thread comonUI(...).
Veja também
- Guia da área:
ui/· Receitas:cookbook/ - Base do padrão:
Picker - Componentes relacionados:
PhotoPicker