Transizione di attività in Android


189

Come posso definire la transizione tra due attività per Android 1.5 e versioni successive? Vorrei svanire un'attività.


7
Si applica alle overridePendingTransitionrisposte completamente correlate di seguito: puoi passare (0, 0)se non desideri alcuna animazione.
dokkaebi,

Risposte:


164

Puoi farlo con Activity.overridePendingTransition(). È possibile definire semplici animazioni di transizione in un file di risorse XML.


Grazie iandisme. overridePengingTransition è di livello API 5. Non è possibile farlo per il livello 3 (Android 1.5)?
hpique

Ah, hai ragione. La risposta di CaseyB è probabilmente più in linea con ciò che stai cercando.
iandisme,

Non ho ancora trovato il modo di fare una dissolvenza corretta con la risposta di CaseyB.
hpique

1
Puoi farlo nella onCreatefunzione della tua attività .
MXC

1
Su HTC devi cambiare le impostazioni> display> animazione per far funzionare tutto (o almeno su HTC Desire HD).
Urboss,

192

Ecco il codice per eseguire una dissolvenza graduale tra due attività.

Creare un file denominato fadein.xmlinres/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" />

Creare un file denominato fadeout.xmlinres/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 si vuole svanire da Activity A alla Attività B , inserire il seguente nel onCreate()metodo per Attività B . Prima setContentView()funziona per me.

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

Se le dissolvenze sono troppo lente per te, cambia android:durationi file XML sopra in qualcosa di più piccolo.


54
Solo per aggiungere a questo. overridePendingTransition () dovrà essere richiamato di nuovo, subito dopo che il sistema operativo ha deciso di chiudere l'attività. Ho appena inserito un'altra identica chiamata a overridePendingTransition (fadein, fadeout) nel metodo onPause () di Activity. Altrimenti, vedrai l'attività svanire, ma non svanire quando chiusa.
Nate,

2
Nessuna risposta sull'altro thread. Lo sto cancellando. Quello che sto sperimentando è ciò che accade è che la transizione si verifica immediatamente e poi si oscura e si dissolve. Quindi sono sull'Attività A e viene visualizzata l'Attività B quindi si attenua e si dissolve. L'ho modificato per seguire le istruzioni con aggiungendo il codice a onPause () dell'attività A e ottenendo lo stesso comportamento.
Geeks On Hugs,

12
L'uso delle animazioni Android integrate sembra comportare una transizione più fluida: la overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); visualizzazione di questi file può anche darti suggerimenti su come migliorare le tue animazioni personalizzate (ad es. Facendo sì che la dissolvenza duri più a lungo della dissolvenza).
Dan J,

3
Basta non dimenticare di cambiare fadeine fadeoutdi fade_ine fade_out. Dal post di Dan J
Farid,

2
Secondo i documenti, dovresti chiamare overridePendingTransition()subito dopo aver chiamato finish()e / o startActivity(). Sono stato in grado di ottenere una bella dissolvenza in questo modo chiamandolo subito dopo il lancio della nuova attività.
Ionoclast Brigham,

50

Un modo ancora semplice per farlo è:

  1. Crea uno stile di animazione nel tuo file 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. Aggiungi questo stile al tema della tua app
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar">
      <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>

Questo è tutto :)


31

Sì. Puoi dire al sistema operativo che tipo di transizione vuoi avere per la tua attività.

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

    ...

}

Dove ANIMATION è un numero intero che fa riferimento a un'animazione integrata nel sistema operativo.


Devo fare qualcos'altro per farlo funzionare? getWindow (). setWindowAnimations (android.R.anim.fade_in) non comporta la transizione push che è stata utilizzata per impostazione predefinita, ma non è nemmeno una transizione di dissolvenza. La nuova attività appare appena sopra la precedente in un dispositivo Nexus One.
hpique

1
Questo perché non si richiede una risorsa, si richiede l'id di un'animazione di transizione integrata nel sistema operativo. developer.android.com/intl/fr/reference/android/view/…
CaseyB

4
Sembra setWindowAnimations accetta solo risorse di stile. getWindow (). setWindowAnimations (android.R.style.Animation_Toast) è il più vicino a cui ho trovato una dissolvenza, ma svanisce dal nero, non dall'attività precedente.
hpique

1
Non deve essere integrato nell'animazione nel sistema operativo, puoi definirne uno personalizzato in valori.
ilija139,

1
@ ilija139, sei sicuro? Qui dice developer.android.com/reference/android/view/… : "Questa deve essere una risorsa di sistema; non può essere una risorsa dell'applicazione perché il gestore di finestre non ha accesso alle applicazioni."
lapis,

29

crea 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" />

crea 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" />

In res> valori> styles.xml

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

Nelle attività onCreate ()

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

2
Suggerirei di aggiungerlo a un tema in modo che venga applicato a tutte le attività?
Peterdk,

12
Queste animazioni sono già definite in Android, è sufficiente aggiungere il seguente codice in onPause () di tutte le attività:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Elad Nava,

Sì, volevo solo mostrare che l'animazione può essere modificata a piacimento degli sviluppatori.
IceSteve il


26

Sovrascrivo l'animazione dell'attività predefinita. Lo collaudo in api 15 che funziona senza problemi. Ecco la soluzione che utilizzo:

<!-- 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>

Crea una cartella anim nella cartella res e quindi crea questi quattro file di animazione:

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>

Puoi scaricare il mio progetto di esempio .

È tutto... :)


Questa dovrebbe essere la risposta accettata. Funziona bene!
EdgeDev

24

Ecco il codice per fare una bella sequenza tra due attività.

  1. effetto liscio da sinistra a destra

    Crea un file chiamato slide_in_right.xml e slide_out_right.xml in 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. effetto liscio da destra a sinistra

    Creare un file chiamato animation_enter.xml e animation_leave.xml in 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. Passa da un'attività alla seconda attività

       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. Al momento dell'evento, premere Indietro o passare dalla seconda attività a un'attività

     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
L'overridePendingTransition dovrebbe essere dopo startActivity in 3.
arberg

L'overridePendingTransition dovrebbe essere dopo startActivity in 3 e 4
Tareq

Non funziona per me se overridePendingTransition () messo prima di startActivity ()
Fernando Tan

Dovrebbe chiamare overridePendingTransitionimmediatamente dopo startActivity: developer.android.com/reference/android/app/…
Midhun MP

4

Non è possibile utilizzare overridePendingTransition in Android 1.5. overridePendingTransistion è arrivato su Android 2.0.

Se lo attraverserai senza alcun errore, dovrai compilare per il target (1.5 o versione successiva) usando le animazioni ordinarie (o sei il tuo) o devi compilare per il target (2.0 o versione successiva) usando overridePendingTransistion.

Riepilogo: non è possibile utilizzare overridePendingTransistion in Android 1.5 .

Puoi comunque usare le animazioni integrate nel sistema operativo.


Questo non è corretto Le animazioni sono in Android ben prima dell'1.6 e puoi usare l'overridePendingTransistion con la riflessione per mirare ancora a 1.5.
hpique

Bene, errore mio. Aggiornato il mio post. Puoi sicuramente realizzare le tue animazioni e personalizzarle come desideri in 1.5. Ma non puoi ancora usare overridePendingTransition poiché ha iniziato a comparire nel livello API 5.
Curtain

2

IN GALAXY:

Devi assicurarti di non averlo spento nel dispositivo usando Impostazioni> Opzioni sviluppatore:

due muppet


anche per i dispositivi LG :)
Ultimo_m

Penso di sì ,, ma non ci provo
Maher Ismaail,

Fantastico! Ho trovato la tua risposta dopo diverse ore di ricerche di transizioni e animazioni.
CoolMind,

1

Usa l'API ActivityCompat.startActivity () funziona> 21.

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

1

Prima di iniziare il tuo intento:

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

Ciò fornisce un'animazione predefinita alla transizione delle attività.


0

Alcune versioni di Android supportano Activitytransizioni personalizzate e altre no (dispositivi meno recenti ). Se si desidera utilizzare le transizioni personalizzate, è buona norma verificare se Activityha il overridePendingTransition()metodo, come nelle versioni precedenti.

Per sapere se il metodo esiste o meno, è possibile utilizzare l'API di riflessione. Ecco il semplice codice che controllerà e restituirà il metodo se esiste:

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 quindi, possiamo applicare la nostra transizione, ovvero utilizzare questo metodo se esiste:

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();
               }
            }

Qui, ad esempio, sono state utilizzate semplici animazioni di dissolvenza in entrata e in uscita per la dimostrazione della transizione.


0

rimpicciolisci l'animazione

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" />
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.