Transição de atividade no Android


188

Como posso definir a transição entre duas atividades para o Android 1.5 e posterior? Gostaria que uma atividade aparecesse.


7
Aplica-se às overridePendingTransitionrespostas relacionadas a seguir: Você pode passar (0, 0)se não desejar animação alguma.
Dokkaebi

Respostas:


164

Você pode fazer isso com Activity.overridePendingTransition(). Você pode definir animações de transição simples em um arquivo de recurso XML.


Obrigado iandisme. overridePengingTransition é o nível 5 da API. Não é possível fazer isso no nível 3 (Android 1.5)?
Hpique

Ah, você está certo. A resposta de CaseyB provavelmente é mais parecida com o que você está procurando.
Iandisme

Ainda não encontrei como fazer um desvanecimento adequado com a resposta de CaseyB.
Hpique

1
Você pode fazer isso na onCreatefunção da sua atividade .
Mxcl 20/03/12

1
No HTC, tem de alterar as definições> o ecrã> a animação para que tudo funcione (ou pelo menos no HTC Desire HD).
Urboss

191

Aqui está o código para fazer um bom desvanecimento suave entre duas atividades.

Crie um arquivo chamado fadein.xmlnores/anim

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
   android:interpolator="@android:anim/accelerate_interpolator"
   android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="2000" />

Crie um arquivo chamado fadeout.xmlnores/anim

<?xml version="1.0" encoding="utf-8"?>

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
   android:interpolator="@android:anim/accelerate_interpolator"
   android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="2000" />

Se você quiser desaparecer de Atividade à Atividade B , coloque o seguinte no onCreate()método para a Atividade B . Antes setContentView()funciona para mim.

overridePendingTransition(R.anim.fadein, R.anim.fadeout);

Se o desbotamento for muito lento para você, altere android:durationos arquivos xml acima para algo menor.


53
Apenas para adicionar a isso. overridePendingTransition () precisará ser chamado novamente, logo após o sistema operacional decidir fechar sua atividade. Acabei de fazer outra chamada idêntica para substituirPendingTransition (fadein, fadeout) no método onPause () da Activity. Caso contrário, você verá a Atividade aparecer gradualmente, mas não desaparecer quando fechada.
Nate

2
Nenhuma resposta em outro tópico. Eu estou excluindo. O que estou experimentando é o que acontece é que a transição ocorre imediatamente e depois escurece e desaparece. Então, eu estou na Atividade A e a Atividade B é exibida, depois fica fraca e desaparece. Depois modifiquei-a para seguir as instruções com adicionando o código à onPause () da Atividade A e obtenha o mesmo comportamento.
Geeks On Hugs

12
O uso das animações internas do Android parece resultar em uma transição mais suave: a overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); visualização desses arquivos também pode fornecer dicas sobre como melhorar suas animações personalizadas (por exemplo, tornando o desvanecimento durar mais tempo do que o desvanecimento).
Dan J

3
Só não se esqueça de mudar fadeine fadeoutpara fade_ine fade_out. Da publicação de Dan J
Farid

1
De acordo com os documentos, você deve ligar overridePendingTransition()logo após ligar finish()e / ou startActivity(). Consegui obter um bom desbotamento dessa maneira chamando-o logo após o lançamento da nova atividade.
Ionoclast Brigham

50

Uma maneira ainda mais fácil de fazer isso é:

  1. Crie um estilo de animação no seu arquivo styles.xml
<style name="WindowAnimationTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
  1. Adicione este estilo ao tema do seu aplicativo
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar">
      <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>

É isso aí :)


31

Sim. Você pode dizer ao sistema operacional que tipo de transição você deseja ter para sua atividade.

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getWindow().setWindowAnimations(ANIMATION);

    ...

}

Onde ANIMATION é um número inteiro que se refere a uma animação incorporada no sistema operacional.


Preciso fazer outra coisa para que funcione? getWindow (). setWindowAnimations (android.R.anim.fade_in) não resulta na transição push usada por padrão, mas também não é uma transição fade. A nova atividade apenas aparece sobre a anterior em um dispositivo Nexus One.
Hpique

1
Isso porque isso não está solicitando um recurso, está solicitando o ID de uma animação de transição incorporada ao sistema operacional. developer.android.com/intl/fr/reference/android/view/…
CaseyB

4
Parece que setWindowAnimations aceita apenas recursos de estilo. getWindow (). setWindowAnimations (android.R.style.Animation_Toast) é o mais próximo que encontrei de um desvanecimento, mas desaparece do preto, não da atividade anterior.
Hpique

1
Ele não precisa ser incorporado na animação do sistema operacional; você pode definir uma personalizada em valores.
precisa saber é o seguinte

1
@ ilija139, você tem certeza? Ele diz aqui developer.android.com/reference/android/view/… : "Este deve ser um recurso do sistema; não pode ser um recurso de aplicativo porque o gerenciador de janelas não tem acesso a aplicativos".
lapis

29

criar res> anim> fadein.xml

<?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:interpolator="@android:anim/accelerate_interpolator"
       android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="500" />

criar res> anim> fadeout.xml

<?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:interpolator="@android:anim/accelerate_interpolator"
       android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="500" />

Em res> valores> styles.xml

<style name="Fade">
        <item name="android:windowEnterAnimation">@anim/fadein</item>
        <item name="android:windowExitAnimation">@anim/fadeout</item>
    </style>

Nas atividades onCreate ()

getWindow().getAttributes().windowAnimations = R.style.Fade;

2
Sugiro adicioná-lo a um tema para que seja aplicado a todas as atividades?
Peterdk

12
Essas animações já estão definidas no Android, basta adicionar o seguinte código na onPause () de todas as atividades:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Elad Nava

Sim, só queria mostrar que a animação pode ser editada ao gosto dos desenvolvedores.
IceSteve


25

Substituí minha animação de atividade padrão. Eu testei na api 15 que ele funciona sem problemas. Aqui está a solução que eu uso:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorPrimary</item>
    <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>

</style>

<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>

Crie uma pasta anim na pasta res e crie esses quatro arquivos de animação:

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="-100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

Você pode baixar meu projeto de amostra .

Isso é tudo... :)


Essa deve ser a resposta aceita. Funciona bem!
EdgeDev 10/02/19

24

Aqui está o código para fazer uma boa suavização entre duas atividades.

  1. efeito suave da esquerda para a direita

    Crie um arquivo chamado slide_in_right.xml e slide_out_right.xml em res / anim

    slide_in_right.xml

        <?xml version="1.0" encoding="utf-8"?>
        <set xmlns:android="http://schemas.android.com/apk/res/android"
            android:shareInterpolator="false" >
            <translate android:duration="5000" android:fromXDelta="100%" android:toXDelta="0%" />
            <alpha android:duration="5000" android:fromAlpha="0.0" android:toAlpha="1.0" />
        </set>

    slide_out_right.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false" >
        <translate android:duration="5000" android:fromXDelta="0%" android:toXDelta="-100%"/>
        <alpha android:duration="5000" android:fromAlpha="1.0" android:toAlpha="0.0" />
    </set>
  2. efeito suave da direita para a esquerda

    Crie um arquivo chamado animation_enter.xml e animation_leave.xml em res / anim

    animation_enter.xml

       <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate android:fromXDelta="-100%" android:toXDelta="0%"
            android:fromYDelta="0%" android:toYDelta="0%"
            android:duration="700"/>
       </set>

    animation_leave.xml

      <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate
            android:fromXDelta="0%" android:toXDelta="100%"
            android:fromYDelta="0%" android:toYDelta="0%"
            android:duration="700" />
      </set>
  3. Navegue de uma atividade para a segunda Atividade

       Intent intent_next=new Intent(One_Activity.this,Second_Activity.class);
       overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_right);
       startActivity(intent_next);
     finish();

    4. Na volta, pressione o evento ou Navegue da segunda atividade para uma Atividade

     Intent home_intent = new Intent(Second_Activity.this, One_Activity.class);
     overridePendingTransition(R.anim.animation_enter, R.anim.animation_leave);
     startActivity(home_intent);
     finish();

3
O overridePendingTransition deve ser após startActivity em 3.
Arberg

O overridePendingTransition deve ser após startActivity em 3 e 4
Tareq

Não está funcionando para mim se substituirPendingTransition () colocado antes de startActivity () #
Fernando Tan

Deve chamar overridePendingTransitionimediatamente após o startActivity: developer.android.com/reference/android/app/…
Midhun MP 21/03/19

4

Você não pode usar overridePendingTransition no Android 1.5. overridePendingTransistion chegou ao Android 2.0.

Se você passar por isso sem nenhum erro, precisará compilar para o destino (1,5 ou superior) usando as animações comuns (ou você possui) ou precisará compilar para o destino (2,0 ou superior) usando overridePendingTransistion.

Resumo: você não pode usar overridePendingTransistion no Android 1.5 .

Você pode usar as animações integradas no sistema operacional.


Isso não é correto. As animações estão no Android bem antes da 1.6 e você pode usar overridePendingTransistion com reflexão para ainda atingir 1.5.
Hpique

Bem, meu erro. Atualizei minha postagem. Você certamente pode criar suas próprias animações e personalizá-las como quiser no 1.5. Mas você ainda não pode usar overridePendingTransition desde que começou a aparecer no nível API 5.
Cortina

2

Em dispositivos GALAXY:

Você precisa ter certeza de que não o desativou no dispositivo usando Configurações> Opções do desenvolvedor:

dois muppets


mesmo para dispositivos LG :)
Ultimo_m

Eu acho que sim, mas eu não experimentá-lo
Maher Ismaail

Fantástico! Encontrei sua resposta depois de várias horas pesquisando transições e animações.
CoolMind

1

Use ActivityCompat.startActivity () funciona API> 21.

    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
    ActivityCompat.startActivity(activity, intent, options.toBundle());

1

Antes de iniciar sua intenção:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(AlbumListActivity.this);
startActivity(intent, options.toBundle());

Isso fornece animação padrão para sua transição de atividade.


0

Algumas versões do Android suportam Activitytransições personalizadas e outras não (dispositivos mais antigos). Se você deseja usar transições personalizadas, é uma boa prática verificar se a opção ActivitypossuioverridePendingTransition() método , como nas versões anteriores.

Para saber se o método existe ou não, a API de reflexão pode ser usada. Aqui está o código simples que irá verificar e retornar o método, se existir:

Method mOverridePendingTransition;

try {
        mOverridePendingTransition = Activity.class.getMethod(
                "overridePendingTransition", new Class[] { Integer.TYPE, Integer.TYPE } );
        /* success */
    } catch (NoSuchMethodException nsme) {
        /* failure, this version of Android doesn't have this method */
    } 

E então, podemos aplicar nossa própria transição, ou seja, usar este método, se existir:

if (UIConstants.mOverridePendingTransition != null) {
               try {
                   UIConstants.mOverridePendingTransition.invoke(MainActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
               } catch (InvocationTargetException e) {
                   e.printStackTrace();
               } catch (IllegalAccessException e) {
                   e.printStackTrace();
               }
            }

Aqui, como exemplo, animações simples de entrada e saída foram usadas para demonstração de transição.


0

diminuir o zoom da animação

Intent i = new Intent(getApplicationContext(), LoginActivity.class);
 overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
startActivity(i);
finish();

zoom_enter

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="0.0" android:toAlpha="1.0"
    android:duration="500" />

zoom_exit

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="1.0" android:toAlpha="0.0"
    android:fillAfter="true"
    android:duration="500" />
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.