Como fornecer animação ao chamar outra atividade no Android?

115

Tenho duas atividades A e B. Quero reduzir a animação quando a atividade A chamar B e maximizar a animação quando a atividade B chamar A. Não preciso dos arquivos xml de animação para isso.

Quando chamamos outra Activity no Android, ela fornece sua animação padrão e, em seguida, chama a animação de redução.

O que eu quero é que a animação padrão não ocorra e a animação que eu quero ocorra.

Podemos realmente dar a animação ao chamar outra atividade?

Sunil
fonte

Respostas:

144

Desde a API 16, você pode fornecer um pacote de opções de atividade ao chamar Context.startActivity (Intent, Bundle) ou métodos relacionados. Ele é criado por meio do construtor ActivityOptions :

Intent myIntent = new Intent(context, MyActivity.class);
ActivityOptions options = 
   ActivityOptions.makeCustomAnimation(context, R.anim.fade_in, R.anim.fade_out);
context.startActivity(myIntent, options.toBundle());

Não se esqueça de verificar os outros métodos do construtor ActivityOptions e ActivityOptionsCompat se você estiver usando a Biblioteca de Suporte.



API 5+:

Para aplicativos destinados ao nível de API 5+, existe o overridePendingTransitionmétodo Activities . São necessários dois IDs de recursos para as animações de entrada e saída. Um id de 0desativará as animações. Ligue imediatamente após a startActivityligação.

ie:

startActivity(new Intent(this, MyActivity.class));
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

API 3+:

Você pode evitar a animação padrão (deslize da direita) com a Intent.FLAG_ACTIVITY_NO_ANIMATIONbandeira em seu intent.

ie:

Intent myIntent = new Intent(context, MyActivity.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
context.startActivity(myIntent);

então, em sua Atividade, você simplesmente precisa especificar sua própria animação.

Isso também funciona para a API 1.5 (Nível 3).

whlk
fonte
4
O que você quer dizer quando diz "especifique sua própria animação"? Como você faz isso? Obrigado!
pqn
Eu tenho a mesma pergunta. Provavelmente em iniciar animação em onResume e onPause.
Tima
existe uma maneira de usar o Animator em vez disso?
desenvolvedor Android de
Você também pode usar o mesmo depois de chamar finish ()!
thiagolr
R.anim.fade_inAinda não é uma animação de arquivo xml que supomos ter res\anim ?
Alex Jolig
78

Você deve usar o método OverridePendingTransition para alcançá-lo, que está na classe Activity . Animações de exemplo na pasta res / anim do exemplo apidemos. Verifique-o. Mais do que verificar a demonstração em ApiDemos / App / Activity / animation .

Exemplo:

@Override
public void onResume(){
    // TODO LC: preliminary support for views transitions
    this.overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
}
Praveen
fonte
1
Obrigado pela resposta. O método overridePendingTransition é compatível com a API de nível 5 e quero que o aplicativo seja compatível com o Android 1.5. Existe alguma outra maneira de fornecer animação de uma atividade para outra.
domingo,
5
impressionante! é muito divertido brincar com
Someone Somewhere
@unil, tenho a mesma pergunta que a sua. você poderia resolver o problema? animação com API de nível 3 ou 4 (não 5)
Dr.jacky
manter o código da animação em onResume () fará com que a animação seja reproduzida quando o usuário sair do aplicativo e voltar. Não é ideal em muitos aplicativos.
Vihaan Verma
Eu precisava adicionar super.onResume();, estava recebendo: "android.util.SuperNotCalledException: Activity {com.abc.MyActivity} não chamou super.onResume ()"
Gene Bo
3

O Jelly Bean adiciona suporte para isso com o método ActivityOptions.makeCustomAnimation () . Claro, como está apenas no Jelly Bean, é praticamente inútil para fins práticos.

phreakhead
fonte
5
Não é mais inútil :)
Greg Ennis
Use ActivityOptionsCompatse você direcionar o pré-JellyBean.
Thuy Trinh