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.

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

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

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

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

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

Untuk daftar animasi default, lihat: http://developer.android.com/reference/android/R.anim.html

Sebenarnya ada fade_indan fade_outuntuk API level 1 ke atas.

Kevin C. Krinke
sumber
2
mis. getWindow (). setWindowAnimations (android.R.anim.slide_in_left);
Pierre
5
Cheers, butuh waktu lama bagi saya Googling untuk menemukannya.
georgiecasey
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... :)

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

Tirai
sumber
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

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

Sebelum Memulai Tujuan Anda:

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

Ini memberikan Animasi Default ke Transisi Aktivitas Anda.

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

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

sumber