TL; DR: Estou procurando uma amostra de trabalho completa do que chamarei de cenário de "animação de três fragmentos do Gmail". Especificamente, queremos começar com dois fragmentos, como este:
Em algum evento da interface do usuário (por exemplo, tocando em algo no fragmento B), queremos:
- Fragmento A para deslizar para fora da tela para a esquerda
- Fragmento B para deslizar para a borda esquerda da tela e encolher para ocupar o lugar vazio pelo fragmento A
- Fragmento C para deslizar do lado direito da tela e ocupar o lugar desocupado pelo Fragmento B
E, pressionando o botão VOLTAR, queremos que esse conjunto de operações seja revertido.
Agora, eu tenho visto muitas implementações parciais; Vou revisar quatro deles abaixo. Além de incompletos, todos têm seus problemas.
@Reto Meier contribuiu com essa resposta popular para a mesma pergunta básica, indicando que você usaria setCustomAnimations()
com a FragmentTransaction
. Para um cenário de dois fragmentos (por exemplo, você só vê o fragmento A inicialmente e deseja substituí-lo por um novo fragmento B usando efeitos animados), concordo plenamente. Contudo:
- Como você pode especificar apenas uma animação "de entrada" e outra "de saída", não vejo como você lida com todas as diferentes animações necessárias para o cenário de três fragmentos.
- O
<objectAnimator>
código de exemplo usa posições fixas em pixels, o que parece impraticável considerando os tamanhos de tela variados, massetCustomAnimations()
requer recursos de animação, impedindo a possibilidade de definir essas coisas em Java - Não sei como os animadores de objetos de escala se relacionam com coisas como
android:layout_weight
em umLinearLayout
para alocar espaço em porcentagem - Eu estou em uma perda a respeito de como Fragmento C é tratada no início (
GONE
?android:layout_weight
De0
? Pré-animado com uma escala de 0? Outra coisa?)
A @Roman Nurik ressalta que você pode animar qualquer propriedade , incluindo aquelas que você mesmo define. Isso pode ajudar a resolver o problema das posições com fio, ao custo de inventar sua própria subclasse do gerenciador de layout personalizado. Isso ajuda alguns, mas ainda estou confuso com o resto da solução de Reto.
O autor desta entrada pastebin mostra alguns pseudocódigos tentadores, basicamente dizendo que todos os três fragmentos residiriam no contêiner inicialmente, com o Fragmento C oculto no início por meio de uma hide()
operação de transação. Em seguida, show()
C e hide()
A quando o evento da interface do usuário ocorre. No entanto, não vejo como isso lida com o fato de B mudar de tamanho. Ele também se baseia no fato de que você aparentemente pode adicionar vários fragmentos ao mesmo contêiner, e não tenho certeza se esse é um comportamento confiável a longo prazo (sem mencionar que ele deve quebrar findFragmentById()
, embora eu possa conviver com isso).
O autor desta postagem no blog indica que o Gmail não está usando setCustomAnimations()
nada, mas usa diretamente animadores de objetos ("você acabou de alterar a margem esquerda da visualização raiz + a largura da visualização correta"). No entanto, essa ainda é uma solução AFAICT de dois fragmentos, e a implementação mostrada novamente mostra as dimensões dos fios em pixels.
Vou continuar me entendendo, para que eu possa responder isso algum dia, mas realmente espero que alguém tenha elaborado a solução de três fragmentos para esse cenário de animação e possa postar o código (ou um link para ele). As animações no Android me fazem querer arrancar meus cabelos, e aqueles que me viram sabem que esse é um empreendimento amplamente infrutífero.