Przeniesienie aktywności w Androidzie


188

Jak zdefiniować przejście między dwiema czynnościami dla Androida 1.5 i nowszych? Chciałbym, aby jakieś działanie zniknęło.


7
Dotyczy wszystkich overridePendingTransitionpowiązanych odpowiedzi poniżej: Możesz przekazać, (0, 0)jeśli nie chcesz żadnej animacji.
dokkaebi

Odpowiedzi:


164

Możesz to zrobić za pomocą Activity.overridePendingTransition(). Możesz zdefiniować proste animacje przejścia w pliku zasobów XML.


Dzięki iandisme. overridePengingTransition to API poziom 5. Czy nie jest to możliwe w przypadku poziomu 3 (Android 1.5)?
hpique

Ach, masz rację. Odpowiedź CaseyB jest prawdopodobnie bardziej zbliżona do tego, czego szukasz.
iandisme

Nie znalazłem jeszcze, jak zrobić właściwe przenikanie z odpowiedzią CaseyB.
hpique

1
Możesz to zrobić w onCreatefunkcji Aktywności .
mxcl

1
W HTC musisz zmienić ustawienia> wyświetlanie> animację na wszystkie, aby działało (a przynajmniej na HTC Desire HD).
Urboss

192

Oto kod umożliwiający płynne przejście między dwiema aktywnościami ..

Utwórz plik o nazwie 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" />

Utwórz plik o nazwie 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" />

Jeśli chcesz znikną z Aktywny A na aktywność B , należy umieścić następującą informację w onCreate()sposób aktywny B . Przedtem setContentView()działa dla mnie.

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

Jeśli przejścia są zbyt wolne, zmień android:durationpowyższe pliki xml na coś mniejszego.


54
Aby to dodać. overridePendingTransition () trzeba będzie wywołać ponownie, zaraz po tym, jak system operacyjny zdecyduje się zamknąć twoją aktywność. Właśnie wstawiłem kolejne identyczne wywołanie overridePendingTransition (fadein, fadeout) w metodzie onPause () działania. W przeciwnym razie zobaczysz, że aktywność zanika, ale nie zanika po zamknięciu.
Nate

2
Brak odpowiedzi w innym wątku. Usuwam to To, co się dzieje, to to, że przejście następuje natychmiast, a potem robi się ciemno i znika. Więc jestem w Aktywności A, a Aktywność B jest wyświetlana, następnie gaśnie i znika. Następnie zmodyfikowałem ją, aby postępować zgodnie z instrukcjami dodając kod do onPause () działania A i uzyskaj to samo zachowanie.
Geeks On Hugs

12
Korzystanie z wbudowanych animacji Androida wydaje się powodować płynniejsze przejście: przeglądanie overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); tych plików może również dać ci wskazówki, jak ulepszyć niestandardowe animacje (np. Dzięki temu, że wyciszanie będzie trwać dłużej niż wygaszanie).
Dan J

3
Tylko nie zapomnij się zmienić fadeini fadeoutdo fade_ini fade_out. Z postu Dana J
Farid

2
Zgodnie z dokumentami powinieneś zadzwonić overridePendingTransition()zaraz po telefonie finish()i / lub startActivity(). W ten sposób udało mi się uzyskać ładny zanik, nazywając go zaraz po uruchomieniu nowego działania.
Ionoclast Brigham

50

Jeszcze łatwym sposobem na to jest:

  1. Utwórz styl animacji w pliku 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. Dodaj ten styl do motywu aplikacji
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar">
      <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>

Otóż ​​to :)


31

Tak. Możesz powiedzieć systemowi operacyjnemu, jaki rodzaj przejścia chcesz zastosować w swojej działalności.

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

    ...

}

Gdzie ANIMACJA jest liczbą całkowitą odnoszącą się do wbudowanej animacji w systemie operacyjnym.


Czy muszę zrobić coś innego, aby zadziałało? getWindow (). setWindowAnimations (android.R.anim.fade_in) nie powoduje domyślnego przejścia wypychanego, ale nie jest to również przejście przenikania. Nowa aktywność pojawia się właśnie nad poprzednią na urządzeniu Nexus One.
hpique

1
Wynika to z faktu, że nie wymaga to zasobu, tylko identyfikator animacji przejścia wbudowanej w system operacyjny. developer.android.com/intl/fr/reference/android/view/…
CaseyB

4
Wygląda na to, że setWindowAnimations akceptuje tylko zasoby stylu. getWindow (). setWindowAnimations (android.R.style.Animation_Toast) jest najbliżej zanikania, ale zanika z czerni, a nie poprzedniej aktywności.
hpique

1
Nie musi być wbudowana animacja w systemie operacyjnym, możesz zdefiniować niestandardową w wartościach.
ilija139,

1
@ ilija139, jesteś pewien? Napisano tutaj developer.android.com/reference/android/view/… : „To musi być zasób systemowy; nie może to być zasób aplikacji, ponieważ menedżer okien nie ma dostępu do aplikacji”.
lapis

29

utwórz 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" />

utwórz 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" />

W res> wartości> styles.xml

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

W działaniach onCreate ()

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

2
Sugerowałbym dodanie go do motywu, aby dotyczył wszystkich działań?
Peterdk

12
Te animacje są już zdefiniowane w Androidzie, wystarczy dodać następujący kod w onPause () wszystkich działań:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Elad Nava

Tak, chciałem tylko pokazać, że animację można edytować zgodnie z upodobaniami twórców.
IceSteve,


25

Nadpisuję moją domyślną animację aktywności. Testuję go w API 15, aby działał sprawnie. Oto rozwiązanie, którego używam:

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

Utwórz folder anim w folderze res, a następnie utwórz następujące cztery pliki animacji:

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>

Możesz pobrać mój przykładowy projekt .

To wszystko... :)


To powinna być odpowiedź zaakceptowana. Działa dobrze!
EdgeDev,

24

Oto kod umożliwiający płynne wykonywanie dwóch czynności.

  1. płynny efekt od lewej do prawej

    Utwórz plik o nazwie slide_in_right.xml i slide_out_right.xml w 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. płynny efekt od prawej do lewej

    Utwórz plik o nazwie animation_enter.xml i animation_leave.xml w res / anim

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

    animacja_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. Nawiguj od jednego działania do drugiego

       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 wstecz naciśnij zdarzenia lub przejdź z drugiego działania do jednego działania

     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
PrzesłonięciePendingTransition powinno nastąpić po startActivity w 3.
arberg

PrzesłonięciePendingTransition powinno nastąpić po uruchomieniuActivity w 3 i 4
Tareq

Nie działa dla mnie, jeśli overridePendingTransition () wstawiono przed startActivity ()
Fernando Tan

Powinien zadzwonić overridePendingTransitionnatychmiast po starcieActivity: developer.android.com/reference/android/app/…
Midhun MP

4

Nie można użyć funkcji overridePendingTransition w systemie Android 1.5. overridePendingTransistion przyszedł do Androida 2.0.

Jeśli przejdziesz przez to bezbłędnie, musisz skompilować dla celu (1.5 lub wyżej) używając zwykłych animacji (lub twoich) lub musisz skompilować dla celu (2.0 lub wyżej) używając overridePendingTransistion.

Podsumowanie: Nie można użyć funkcji overridePendingTransistion w systemie Android 1.5 .

Możesz jednak użyć wbudowanych animacji w systemie operacyjnym.


To nie jest poprawne. Animacje są w Androidzie znacznie wcześniej niż 1.6 i możesz użyć overridePendingTransistion z odbiciem, aby nadal celować w 1,5.
hpique

Mój błąd. Zaktualizowałem mój post. Z pewnością możesz tworzyć własne animacje i dostosowywać je tak, jak chcesz w 1.5. Ale nadal nie możesz użyć overridePendingTransition, ponieważ zaczął pojawiać się w API na poziomie 5
Curtain

2

W urządzeniach GALAXY:

Musisz upewnić się, że nie wyłączyłeś go w urządzeniu, wybierając Ustawienia> Opcje programisty:

dwa muppety


nawet dla urządzeń LG :)
Ultimo_m

Myślę, że tak, ale nie próbuję
Maher Ismaail

Fantastyczny! Znalazłem twoją odpowiedź po kilku godzinach przeszukiwania przejść i animacji.
CoolMind,

1

Użyj ActivityCompat.startActivity () działa API> 21.

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

1

Przed rozpoczęciem zamiaru:

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

Daje to domyślną animację przejścia aktywności.


0

Niektóre wersje Androida obsługują niestandardowe Activityprzejścia, a niektóre nie (starsze urządzenia). Jeśli chcesz używać niestandardowych przejść, dobrą praktyką jest sprawdzenie, czy Activityma tę overridePendingTransition()metodę, jak w starszych wersjach nie.

Aby wiedzieć, czy metoda istnieje, czy nie, można użyć interfejsu API refleksji. Oto prosty kod, który sprawdzi i zwróci metodę, jeśli istnieje:

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 */
    } 

Następnie możemy zastosować własne przejście, tj. Użyć tej metody, jeśli istnieje:

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

Tutaj, jako przykład, zastosowano proste animacje pojawiania się i zanikania do demonstracji przejścia.


0

pomniejszyć animację

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" />
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.