Transisi aktivitas di Android


189

Bagaimana saya bisa mendefinisikan transisi antara dua aktivitas untuk Android 1.5 dan yang lebih baru? Saya ingin kegiatan memudar.


7
Berlaku untuk semua overridePendingTransitionjawaban terkait di bawah ini: Anda dapat lulus (0, 0)jika Anda tidak menginginkan animasi sama sekali.
dokkaebi

Jawaban:


164

Anda dapat melakukannya dengan Activity.overridePendingTransition(). Anda dapat menentukan animasi transisi sederhana dalam file sumber daya XML.


Terima kasih iandisme. overridePengingTransition adalah API level 5. Apakah tidak mungkin melakukan ini untuk level 3 (Android 1.5)?
hpique

Ah kamu benar Jawaban CaseyB mungkin lebih sesuai dengan apa yang Anda cari.
iandisme

Belum ditemukan bagaimana cara memudar dengan jawaban CaseyB.
hpique

1
Anda dapat melakukan ini dalam onCreatefungsi Aktivitas Anda .
mxcl

1
Di HTC Anda harus mengubah pengaturan> tampilan> animasi agar semuanya berfungsi (atau setidaknya pada HTC Desire HD).
Urboss

192

Berikut kode untuk melakukan pemudaran halus yang bagus antara dua Kegiatan ..

Buat file bernama fadein.xmldires/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" />

Buat file bernama fadeout.xmldires/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" />

Jika Anda ingin memudar dari Aktivitas A ke Kegiatan B , menempatkan berikut dalam onCreate()metode untuk Kegiatan B . Sebelum setContentView()bekerja untuk saya.

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

Jika fade terlalu lambat untuk Anda, ubah android:durationfile xml di atas menjadi sesuatu yang lebih kecil.


54
Hanya untuk menambah ini. overridePendingTransition () perlu dipanggil lagi, tepat setelah OS memutuskan untuk menutup Aktivitas Anda. Saya hanya melakukan panggilan lain yang identik ke overridePendingTransition (fadein, fadeout) dalam metode onPause () Activity. Kalau tidak, Anda akan melihat Aktivitas memudar, tetapi tidak memudar saat ditutup.
Nate

2
Tidak ada jawaban di utas lainnya. Saya menghapusnya. Apa yang saya alami adalah apa yang terjadi adalah transisi terjadi segera dan kemudian menjadi gelap dan memudar. Jadi saya di Aktivitas A dan Kegiatan B ditampilkan kemudian menjadi redup dan memudar. Saya kemudian memodifikasinya untuk mengikuti instruksi dengan menambahkan kode ke onPause () dari Aktivitas A dan mendapatkan perilaku yang sama.
Geeks On Hugs

12
Menggunakan animasi bawaan Android tampaknya menghasilkan transisi yang lebih lancar: overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); Melihat file-file itu juga dapat memberi Anda petunjuk tentang cara meningkatkan animasi kustom Anda (misalnya dengan membuat fade lebih lama daripada fade out).
Dan J

3
Hanya saja, jangan lupa untuk mengubah fadeindan fadeoutke fade_indan fade_out. Dari pos Dan J
Farid

2
Menurut dokumen, Anda harus menelepon overridePendingTransition()segera setelah menelepon finish()dan / atau startActivity(). Saya dapat memudar dengan cara ini dengan memanggilnya tepat setelah meluncurkan Aktivitas baru.
Ionoclast Brigham

50

Cara yang bahkan mudah untuk melakukannya adalah:

  1. Buat gaya animasi ke dalam file styles.xml Anda
<style name="WindowAnimationTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
  1. Tambahkan gaya ini ke tema aplikasi Anda
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar">
      <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>

Itu dia :)


31

Iya. Anda dapat memberi tahu OS transisi seperti apa yang Anda inginkan untuk aktivitas Anda.

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

    ...

}

Di mana ANIMATION adalah bilangan bulat yang mengacu pada animasi bawaan di OS.


Apakah saya harus melakukan sesuatu yang lain agar bisa berfungsi? getWindow (). setWindowAnimations (android.R.anim.fade_in) tidak menghasilkan transisi push yang digunakan secara default, tetapi juga bukan transisi fade. Aktivitas baru muncul di atas aktivitas sebelumnya di perangkat Nexus One.
hpique

1
Itu karena ini bukan meminta sumber daya, itu meminta id animasi transisi yang dibangun ke dalam OS. developer.android.com/intl/fr/reference/android/view/…
CaseyB

4
Tampaknya setWindowAnimations hanya menerima sumber daya gaya. getWindow (). setWindowAnimations (android.R.style.Animation_Toast) adalah yang terdekat yang saya temukan memudar, tetapi memudar dari hitam, bukan aktivitas sebelumnya.
hpique

1
Itu tidak harus dibangun di animasi di OS, Anda dapat menentukan satu kustom dalam nilai.
ilija139

1
@ ilija139, apakah Anda yakin? Dikatakan di sini developer.android.com/reference/android/view/… : "Ini harus menjadi sumber daya sistem; tidak dapat menjadi sumber daya aplikasi karena manajer jendela tidak memiliki akses ke aplikasi."
lapis

29

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

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

Dalam res> values> styles.xml

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

Dalam aktivitas onCreate ()

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

2
Saya sarankan menambahkannya ke tema sehingga diterapkan untuk semua kegiatan?
Peterdk

12
Animasi ini sudah ditentukan di Android, cukup tambahkan kode berikut di onPause () dari semua aktivitas:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Elad Nava

Ya, hanya ingin menunjukkan bahwa animasi dapat diedit sesuai keinginan pengembang.
IceSteve


26

Saya menimpa animasi aktivitas default saya. Saya mengujinya di api 15 agar bekerja dengan lancar. Inilah solusi yang saya gunakan:

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

Buat folder anim di bawah folder res dan kemudian buat empat file animasi ini:

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>

Anda dapat mengunduh proyek sampel saya .

Itu saja... :)


Ini harus menjadi Jawaban yang Diterima. Bekerja dengan baik!
EdgeDev

24

Berikut kode untuk melakukan kelancaran yang bagus di antara dua aktivitas.

  1. efek halus dari kiri ke kanan

    Buat file bernama slide_in_right.xml dan slide_out_right.xml di 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. efek halus dari kanan ke kiri

    Buat file bernama animation_enter.xml dan animation_leave.xml di 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. Menavigasi dari satu aktivitas ke Aktivitas kedua

       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.Pada kembali acara tekan atau Navigasi dari aktivitas kedua ke satu Kegiatan

     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
OverridePendingTransition harusnya setelah startActivity dalam 3.
arberg

OverridePendingTransition harusnya setelah startActivity dalam 3 dan 4
Tareq

Ini tidak berfungsi untuk saya jika overridePendingTransition () diletakkan sebelum startActivity ()
Fernando Tan

Harus menelepon overridePendingTransitionsegera setelah startActivity: developer.android.com/reference/android/app/…
Midhun MP

4

Anda tidak dapat menggunakan overridePendingTransition di Android 1.5. overridePendingTransistion datang ke Android 2.0.

Jika Anda akan melalui ini tanpa kesalahan Anda harus mengkompilasi untuk target (1,5 atau lebih tinggi) menggunakan animasi biasa (atau Anda sendiri) atau Anda harus mengkompilasi untuk target (2,0 atau lebih tinggi) menggunakan overridePendingTransistion.

Ringkasan: Anda tidak dapat menggunakan overridePendingTransistion di Android 1.5 .

Anda dapat menggunakan animasi bawaan di OS.


Itu tidak benar. Animasi sudah ada di Android sebelum 1.6 dan Anda dapat menggunakan overridePendingTransistion dengan refleksi untuk tetap menargetkan 1,5.
hpique

Yah, kesalahanku. Memperbarui pos saya. Anda pasti dapat membuat animasi sendiri dan mengubahnya sesuai keinginan di 1.5. Tetapi Anda masih tidak dapat menggunakan overridePendingTransition karena mulai muncul di API-level 5.
Curtain

2

DALAM GALAXY Perangkat:

Anda perlu memastikan bahwa Anda tidak mematikannya di perangkat menggunakan Pengaturan> Opsi Pengembang:

dua muppets


bahkan untuk perangkat LG :)
Ultimo_m

Saya kira begitu ,, tapi saya tidak mencobanya
Maher Ismaail

Fantastis! Saya menemukan jawaban Anda setelah beberapa jam mencari transisi dan animasi.
CoolMind

1

Gunakan ActivityCompat.startActivity () berfungsi API> 21.

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

1

Sebelum Memulai Tujuan Anda:

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

Ini memberikan Animasi Default ke Transisi Aktivitas Anda.


0

Beberapa versi Android mendukung Activitytransisi khusus dan beberapa tidak (perangkat yang lebih lama). Jika Anda ingin menggunakan transisi khusus, praktik yang baik untuk memeriksa apakah Activitymemiliki overridePendingTransition()metode, seperti pada versi yang lebih lama tidak.

Untuk mengetahui apakah metode itu ada atau tidak, API refleksi dapat digunakan. Berikut adalah kode sederhana yang akan memeriksa dan mengembalikan metode jika ada:

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

Dan kemudian, kita dapat menerapkan transisi kita sendiri, yaitu menggunakan metode ini jika ada:

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

Di sini, sebagai contoh, animasi fade-in dan fade-out sederhana digunakan untuk demonstrasi transisi ..


0

memperbesar animasi

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" />
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.