Estou tentando animar a transição entre fragmentos. Eu recebi a resposta dos seguintes
fragmentos e animação do Android
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
DetailsFragment newFragment = DetailsFragment.newInstance();
ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");
// Start the animated transition.
ft.commit();
E meu R.anim.slide_in_left
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="50%p" android:toXDelta="0"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
Mas quando eu tentei isso, mostrou
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): FATAL EXCEPTION: main
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): java.lang.RuntimeException: Unknown animator name: translate
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:129)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:126)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:93)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:72)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.loadAnimator(FragmentManager.java:621)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:733)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.BackStackRecord.run(BackStackRecord.java:578)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1217)
Alguma ideia? Quando chequei a referência da API do Honeycomb, translate
existe. Do que eu senti falta?
Existe alguma outra maneira de animar a transição entre fragmentos? Obrigado
android
android-3.0-honeycomb
Labeeb Panampullan
fonte
fonte
Respostas:
Você precisa usar a nova
android.animation
estrutura (animadores de objeto) eFragmentTransaction.setCustomAnimations
tambémFragmentTransaction.setTransition
.Aqui está um exemplo de uso
setCustomAnimations
do FragmentHideShow.java do ApiDemos :e aqui está o XML do animador relevante em res / animator / fade_in.xml :
Observe que você pode combinar vários animadores usando
<set>
, da mesma maneira que poderia com a estrutura de animação mais antiga.Edição : Como as pessoas estão perguntando sobre slide-in / slide-out, vou comentar sobre isso aqui.
Deslize para dentro e para fora
Pode, claro, animar os
translationX
,translationY
,x
, ey
propriedades, mas geralmente lâminas envolvem animar conteúdo de e para fora da tela. Tanto quanto sei, não existem propriedades de transição que usem valores relativos. No entanto, isso não impede que você os escreva. Lembre-se de que as animações de propriedades simplesmente requerem métodos getter e setter nos objetos que você está animando (neste caso, visualizações), para que você possa criar seus próprios métodosgetXFraction
esetXFraction
métodos na subclasse de visualização, desta forma:Agora você pode animar a propriedade 'xFraction', assim:
res / animador / slide_in.xml :
Observe que, se o objeto em que você está animando não tiver a mesma largura que seu pai, as coisas não parecerão bem; portanto, talvez você precise ajustar a implementação da propriedade para se adequar ao seu caso de uso.
fonte
Eu fiz assim:
Adicione este método para substituir fragmentos por animações :
Você precisa adicionar quatro animações na pasta anim associada ao recurso :
enter_from_left.xml :
exit_to_right.xml :
enter_from_right.xml :
exit_to_left.xml :
Resultado:
Está feito .
fonte
.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right)
Se você pode se dar ao luxo de usar apenas o Lollipop e mais tarde, isso parece funcionar:
Espero que isto ajude.
fonte
new Slide(...)
: chamada requer nível API 21A resposta de Nurik foi muito útil, mas não consegui fazê-la funcionar até encontrar isso . Em resumo, se você estiver usando a biblioteca de compatibilidade (por exemplo, SupportFragmentManager em vez de FragmentManager), a sintaxe dos arquivos de animação XML será diferente.
fonte
Aqui está uma animação de slide in / out entre fragmentos:
Estamos usando um objectAnimator.
Aqui estão os dois arquivos xml na subpasta animador .
enter_anim.xml
exit_anim.xml
Espero que ajude alguém.
fonte
.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_right, R.animator.slide_in_left, R.animator.slide_out_right)
Para quem for pego, verifique se setCustomAnimations é chamado antes da chamada para substituir / adicionar ao criar a transação.
fonte
A implementação do FragmentTransaction no Android SDK quer um
Animator
tempo enquanto a biblioteca de suporte quer umAnimation
, não me pergunte por que, mas depois do comentário do strangeluk, olhei para o código do Android 4.0.3 e a biblioteca de suporte. Usos do SDK do AndroidloadAnimator()
e da biblioteca de suporteloadAnimation()
fonte
Tente usar esta solução simples e em jejum. O Android fornece alguns
animation
s padrão .Resultado:
fonte