Neste Google Codelab (Mars Photos), enquanto o Coil carrega imagens, o aplicativo exibe uma roda de progresso. O código usa este arquivo XML como um drawable:
e usa este código para exibi-lo:
@Composable
fun LoadingScreen(modifier: Modifier = Modifier) {
Box(
contentAlignment = Alignment.Center,
modifier = modifier.fillMaxSize()
) {
Image(
modifier = Modifier.size(200.dp),
painter = painterResource(R.drawable.loading_img),
contentDescription = stringResource(R.string.loading)
)
}
}
No entanto, isso só exibe uma imagem estática. Quero que ela gire (o que eu certamente esperava como comportamento). Pensei em algumas abordagens, nenhuma das quais eu gosto muito:
- Defina 12 arquivos XML semelhantes, um para cada grau de rotação, e exiba cada um continuamente em sequência
- Gere dinamicamente o XML e de alguma forma o converta em um pintor na hora
- Use Coil para carregar um GIF
Existe uma maneira mais simples de realizar essa tarefa? Existe uma maneira de rotacionar a imagem em si programaticamente, como aplicar um modo de animação predefinido de algum tipo (talvez semelhante ao basicMarquee)?
Aqui está o código para o mesmo. Este código foi retirado de https://github.com/SmartToolFactory/Compose-ProgressIndicator e tem muitas outras animações de visualização de progresso circular girando.
val infiniteTransition = rememberInfiniteTransition()
é usado para animação de transição infinita e RepeatMode.Restart significa que a animação reinicia, dando uma sensação de animação infinita.rotate((angle.toInt() + i) * coefficient) {
onde você gira os itens. Todos os cálculos de ângulos são em radianos.Você pode personalizar isso conforme suas necessidades. Você não precisa de uma imagem. Desenhe linhas ou retângulos e anime alguns deles girando-os.