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.

hpique
fonte
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.

iandisme
fonte
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.

Ben Clayton
fonte
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í :)

Felipe Conde
fonte
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.

CaseyB
fonte
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;
IceSteve
fonte
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
29

Para obter uma lista das animações padrão, consulte: http://developer.android.com/reference/android/R.anim.html

De fato, existe fade_ine fade_outpara o nível 1 da API e acima.

Kevin C. Krinke
fonte
2
por exemplo, getWindow (). setWindowAnimations (android.R.anim.slide_in_left);
Pierre
5
Saúde, levei um tempo surpreendentemente longo para pesquisar no Google.
amigos estão dizendo sobre georgiecasey
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... :)

Shohan Ahmed Sijan
fonte
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();
sachin pangare
fonte
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.

Cortina
fonte
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

Maher Ismaail
fonte
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());
Muhammad Aamir Ali
fonte
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.

devDeejay
fonte
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.

Serj Ardovic
fonte
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" />

fonte