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.

hpique
źródł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.

iandisme
źródło
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.

Ben Clayton
źródło
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 :)

Felipe Conde
źródło
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.

CaseyB
źródło
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;
IceSteve
źródło
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,
29

Aby wyświetlić listę domyślnych animacji, zobacz: http://developer.android.com/reference/android/R.anim.html

Jest w rzeczywistości fade_ini fade_outna poziomie API 1 roku.

Kevin C. Krinke
źródło
2
np. getWindow (). setWindowAnimations (android.R.anim.slide_in_left);
Pierre
5
Pozdrowienia zajęło mi zaskakująco długo Googling, aby je znaleźć.
georgiecasey
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... :)

Shohan Ahmed Sijan
źródło
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();
sachin pangare
źródło
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.

Kurtyna
źródło
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

Maher Ismaail
źródło
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());
Muhammad Aamir Ali
źródło
1

Przed rozpoczęciem zamiaru:

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

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

devDeejay
źródło
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.

Serj Ardovic
źródło
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" />

źródło