Os apps Android são executados em mais formatos do que apenas smartphones no modo retrato. Com a introdução do Modo Janela para Computador, telas conectadas e dispositivos dobráveis, o app de câmera precisa se adaptar a tamanhos de janela dinâmicos, proporções variadas e hardware externo.
Por que a lógica do smartphone falha
Os apps de câmera geralmente fazem suposições que causam falhas críticas em ambientes de vários formatos.
Orientação natural
- Suposição: a orientação natural do dispositivo
ROTATION_0é sempre retrato. - Realidade:em tablets, display interno de alguns dispositivos dobráveis e monitores de computador,
ROTATION_0geralmente é paisagem. - Resultado:a visualização é girada incorretamente em 90 graus.
Alinhamento do sensor
- Suposição:a borda longa do sensor da câmera se alinha à borda longa da tela.
- Realidade:uma janela redimensionável pode ser quadrada ou paisagem, enquanto o sensor permanece fixo (geralmente 4:3).
- Resultado:imagens esticadas ou distorcidas.
Densidade e tamanho da tela
- Suposição:a densidade e o tamanho da tela não mudam no momento da execução.
- Realidade:em ambientes de computador, os usuários redimensionam as janelas livremente.
- Resultado:reiniciar a sessão da câmera em cada evento de arrastar interrompe a experiência do usuário e pode causar falhas.
Solução 1: usar intents do sistema
Se o app precisar tirar uma foto ou gravar um vídeo, mas não exigir uma interface de câmera personalizada especializada, a melhor maneira de lidar com diferentes formatos é iniciar a câmera do sistema pré-instalada do dispositivo (consulte Intents da câmera).
O uso de um intent do sistema delega toda a experiência de captura ao app de câmera desenvolvido pelo fabricante do equipamento original (OEM, na sigla em inglês) do dispositivo. Isso terceiriza efetivamente a complexidade do suporte a formatos, incluindo:
- Suporte integrado a redimensionamento e rotação : o app de câmera padrão em um dispositivo dobrável ou tablet é criado explicitamente pelo fabricante para lidar com a geometria específica do dispositivo. O app foi projetado para se comportar corretamente quando o dispositivo é desdobrado, girado ou colocado no modo de várias janelas.
- Acesso a recursos avançados de hardware : os apps de câmera OEM têm acesso exclusivo a algoritmos ajustados por hardware (modo noturno, HDR, troca de lentes específicas) que são difíceis ou impossíveis de replicar manualmente.
Solução 2: usar o CameraX do Jetpack
O CameraX é uma biblioteca do Jetpack criada para facilitar o desenvolvimento de apps de câmera O CameraX reconhece o ciclo de vida e é orientado à superfície. Ao contrário do Camera2, que exige o recálculo manual da orientação do sensor e dos tamanhos da superfície sempre que um dispositivo é dobrado, girado ou redimensionado, o CameraX processa automaticamente a reconfiguração das sessões da câmera durante o redimensionamento de várias janelas ou quando um app é movido para uma tela conectada, garantindo que o fluxo de visualização se adapte sem travamentos ou alongamentos.
Componentes como PreviewView gerenciam de maneira inteligente a proporção e
os tipos de escala em diferentes estados, como um dispositivo dobrável que faz a transição da tela de capa para a tela interna. Isso permite que você ofereça suporte a uma variedade de hardware com
uma implementação única e consistente, em vez de uma coleção complexa de
casos extremos específicos do dispositivo.
Escrever
Com o Jetpack Compose, use a biblioteca dedicada androidx.camera:camera-compose. A biblioteca fornece o elemento combinável CameraXViewfinder, que foi
projetado especificamente para lidar com a geometria complexa de redimensionamento, rotação e
proporções no ciclo de vida do Compose.
O componente CameraXViewfinder elimina as fontes mais comuns de erros em apps de câmera:
- Transformação automática de coordenadas : uma das partes mais difíceis da criação de um app de câmera é mapear o toque de um usuário (coordenadas x, y na tela) para o sistema de coordenadas do sensor da câmera (0-1, 0-1 girado) para foco e medição.
CameraXViewfinderfornece umCoordinateTransformerque processa o cálculo automaticamente, mesmo quando a janela é redimensionada ou o dispositivo é dobrado. - Comportamento correto do layout : ao contrário de
SurfaceViewouTextureView,CameraXViewfinderfunciona corretamente com a ordenação z do Compose. É possível sobrepor elementos da interface (anéis de foco, controles) ou aplicar modificadores (cantos arredondados, animações) sem renderizar artefatos. - Redimensionamento e proporção:
CameraXViewfinderprocessa internamente a lógica de _corte central_ em comparação com o _ajuste central_, garantindo que a visualização não seja esticada quando a janela do app é redimensionada para proporções não padrão (por exemplo, modo de tela dividida ou Modo Janela para Computador).
Visualizações
Em apps baseados em visualização, use PreviewView ou ViewFinderView. Se você usar
SurfaceView ou TextureView diretamente, será necessário calcular a proporção e
aplicar a matriz de transformação correta.
Solução 3: processar a orientação e o redimensionamento de forma dinâmica
Ao usar APIs da plataforma diretamente, lembre-se da rotação do dispositivo, das reinicializações de atividades e da proporção.
Parar de usar a rotação do dispositivo
Não dependa apenas de Display#getRotation() ou da orientação do sensor físico
para determinar o layout da interface.
- Usar métricas de janela : determine o layout (interface no modo paisagem ou retrato
UI) comparando a largura e a altura da janela do app usando
WindowManager#getCurrentWindowMetrics(). - Ignorar a orientação natural : seu app pode estar em uma janela no formato retrato em um monitor no modo paisagem. A orientação do dispositivo é irrelevante para os limites da interface.
Evitar reinicializações de atividades
O comportamento padrão do Android destrói a atividade do app em mudanças de configuração (como redimensionamento de janela). Para apps de câmera, isso aparece como uma oscilação de tela ou uma conexão interrompida durante videochamadas.
- Configuração do manifesto : declare mudanças de configuração no manifesto para processar o redimensionamento sem reiniciar.
- Atualizações dinâmicas : em
onConfigurationChanged(), atualize os parâmetros de layout da visualização da câmera para corresponder ao novo tamanho da janela.
Proporção e corte
Um problema comum em dispositivos dobráveis e janelas de computador é o alongamento da visualização, em que uma transmissão da câmera 4:3 é forçada a entrar em uma janela 16:9 ou 1:1.
- Não esticar : nunca force o buffer da câmera a corresponder exatamente aos limites da visualização se as proporções da visualização e da janela forem diferentes.
- Corte central (recomendado) : dimensione a visualização para preencher a dimensão mais curta da janela e corte o excesso. Isso garante que o assunto permaneça sem distorção e preencha o frame.
- Ajuste central (alternativa) : se for fundamental mostrar todo o campo de visão (por exemplo, ao digitalizar um documento), aplique o efeito letterbox na visualização dentro da janela.
Bônus: suporte a experiências para dispositivos dobráveis
Os dispositivos dobráveis não são apenas smartphones que se dobram. Eles também oferecem estados de hardware exclusivos que podem melhorar fundamentalmente a maneira como os usuários tiram fotos e gravam vídeos. Em vez de tratar a dobra como um problema a ser resolvido, use-a para criar recursos impossíveis em dispositivos não dobráveis.
Modo de mesa (captura com viva-voz)
O modo de mesa permite que os usuários dobrem o dispositivo pela metade e o coloquem em uma superfície para videochamadas estendidas, fotografia em time-lapse e fotografia noturna de longa exposição.
Modo de tela traseira (selfies de alta qualidade)
- Em dispositivos dobráveis, as câmeras traseiras geralmente são de qualidade superior às câmeras voltadas para o usuário. O modo de tela traseira permite que o usuário desdobre o dispositivo e o vire, usando a pequena tela de capa como um visor ao vivo para a câmera traseira principal.
- O modo de tela traseira permite selfies de mais de 50 MP, fotos de grupo ultra-wide e vlogging de alta qualidade sem precisar carregar equipamentos extras.
Modo Dual Screen (visualização do assunto)
- O modo Dual Screen permite mostrar a visualização da câmera nas telas interna e externa simultaneamente. Isso é perfeito para fotografar pessoas: os assuntos da foto podem se ver na tela externa e ajustar a pose enquanto você enquadra a foto na tela interna.
- Ao contrário do modo de tela traseira (que move o app inteiro), o modo Dual Screen cria uma janela de apresentação secundária na tela de capa.