Bagaimana cara melakukan animasi fade pada transisi Aktivitas?

89

Saya mengkodifikasi efek transisi antara aktivitas logo saya dan aktivitas Utama saya, tetapi saya memiliki masalah yang sebelum menghilang aktivitas tersebut pindah ke atas:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

    <alpha
        android:duration="2000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" >
    </alpha>

</set>

Bagaimana saya bisa meningkatkan kode ini untuk mendapatkan hanya efek menghilang?

MarcForn
sumber

Jawaban:

237

Anda dapat membuat file animasi .xml Anda sendiri untuk memudar menjadi yang baru Activitydan memudar saat ini Activity:

fade_in.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" />

fade_out.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:fillAfter="true"
           android:duration="500" />

Gunakan dalam kode seperti itu: (Inside your Activity)

Intent i = new Intent(this, NewlyStartedActivity.class);
startActivity(i);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

Kode di atas akan memudarkan yang saat ini aktif Activitydan memudar di yang baru dimulai Activitymenghasilkan transisi yang mulus.

UPDATE : @Dan J menunjukkan bahwa menggunakan animasi Android bawaan meningkatkan kinerja , yang memang saya temukan terjadi setelah melakukan beberapa pengujian. Jika Anda lebih suka bekerja dengan animasi bawaan, gunakan:

overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

Perhatikan saya mereferensikan android.Ralih-alih Rmengakses id sumber daya.

PEMBARUAN : Sekarang praktik umum untuk melakukan transisi menggunakan kelas Transisi yang diperkenalkan di API level 19 .

Philipp Jahoda
sumber
65
Menggunakan animasi Android bawaan tampaknya menghasilkan transisi yang lebih mulus: 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 in bertahan lebih lama daripada fade out).
Dan J
41
Ini memiliki undescore: overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);:)
AlvaroSantisteban
Apakah saya harus menggunakan overridePendingTransition onCreate atau di setiap Intent? Atau tergantung pada apa yang saya inginkan? Terima kasih.
Ricardo
19
Ada opsi tanpa "mengesampingkan":Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(), android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); startActivity(intent, bundle);
oleynikd
1
Transisi di atas dijalankan hanya jika diaktifkan dalam opsi Pengembang, lihat stackoverflow.com/a/30422015/2914140 .
CoolMind
22

Sekadar memposting ulang jawaban oleh oleynikd karena sederhana dan rapi

Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(),
    android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
startActivity(intent, bundle);
Nikhil
sumber
Karena overridePendingTransition tidak berfungsi di beberapa ponsel dan solusi Enes tidak terlalu bagus, jawaban ini seharusnya benar.
Hugo Passos
19

Anda juga dapat menambahkan animasi dalam aktivitas Anda, dalam metode onCreate seperti di bawah ini karena overridePendingTransition tidak berfungsi dengan beberapa perangkat seluler, atau tergantung pada pengaturan perangkat ...

View view = findViewById(android.R.id.content);
Animation mLoadAnimation = AnimationUtils.loadAnimation(getApplicationContext(), android.R.anim.fade_in);
mLoadAnimation.setDuration(2000);
view.startAnimation(mLoadAnimation);
Enes
sumber
1
Bagaimana menangani animasi untuk aktivitas sebelumnya atau induk?
Mehmed
9
Untuk menyetel animasi untuk transisi kembali ke aktivitas induk gunakan kode ini: @Override public void onBackPressed() { super.onBackPressed(); overridePendingTransition(R.anim.fade_in, R.anim.fade_out); }
John Verco
15

Anda juga dapat menggunakan kode ini di file style.xml Anda sehingga Anda tidak perlu menulis apa pun di activity.java Anda

<!-- 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/colorAccent</item>
    <item name="android:windowAnimationStyle">@style/AppTheme.WindowTransition</item>
</style>

<!-- Setting window animation -->
<style name="AppTheme.WindowTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
Refnhaldy
sumber