Menganimasikan Dialog kustom

97

Saya mencoba membuat dialog khusus muncul seolah-olah sedang meluncur ke bawah dari tampilan teks. Apakah ini mungkin? Sepertinya saya tidak bisa menerapkan animasi apa pun ke kelas dialog. Saya sudah mencoba baris ini di konstruktor, tetapi tidak berpengaruh:

this.getWindow (). setWindowAnimations (R.anim.paranimation);

Saya bahkan tidak yakin apakah animasinya benar, tetapi saya akan dapat menyesuaikannya setelah saya melihat apa yang dilakukannya. Saya akan cantumkan di bawah ini demi kelengkapan. Saya tidak mencari bantuan untuk animasi yang sebenarnya, hanya aplikasi untuk dialog.

paranimation.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="-200%"
    android:toXDelta="0%"
    android:fromYDelta="200%"
    android:toYDelta="0%"
    android:duration="3000"
    android:zAdjustment="top">
</translate>
FMLDev
sumber
4
Saya perlu mengetahui ini juga. Tampaknya mungkin untuk menganimasikan apa saja, selain ini. Atau apakah saya salah ?!
andy_spoo

Jawaban:

215

Saya telah berjuang dengan animasi Dialog hari ini, akhirnya berhasil menggunakan gaya, jadi inilah contohnya.

Pertama-tama, hal yang paling penting - Saya mungkin membuatnya berfungsi dengan 5 cara berbeda hari ini tetapi tidak tahu karena ... Jika pengaturan animasi perangkat Anda disetel ke "Tanpa Animasi" (Pengaturan → Tampilan → Animasi) maka dialog menang tidak dianimasikan apa pun yang Anda lakukan!

Berikut ini adalah versi yang dipreteli dari styles.xml saya. Mudah-mudahan cukup jelas. Ini harus ditempatkan di res/values.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="PauseDialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowAnimationStyle">@style/PauseDialogAnimation</item>
    </style>

    <style name="PauseDialogAnimation">
        <item name="android:windowEnterAnimation">@anim/spin_in</item>
        <item name="android:windowExitAnimation">@android:anim/slide_out_right</item>
    </style>
</resources>

Itu windowEnterAnimationadalah salah satu animasi saya dan terletak di res\anim. Ini windowExitAnimationadalah salah satu animasi yang merupakan bagian dari Android SDK.

Kemudian ketika saya membuat Dialog dalam onCreateDialog(int id)metode aktivitas saya, saya melakukan hal berikut.

Dialog dialog = new Dialog(this, R.style.PauseDialog);

// Setting the title and layout for the dialog
dialog.setTitle(R.string.pause_menu_label);
dialog.setContentView(R.layout.pause_menu);

Alternatifnya, Anda dapat menyetel animasi dengan cara berikut daripada menggunakan konstruktor Dialog yang mengambil tema.

Dialog dialog = new Dialog(this);
dialog.getWindow().getAttributes().windowAnimations = R.style.PauseDialogAnimation;
ChrisJD
sumber
2
Itu hanya nama yang saya buat untuk contoh ini, saya tidak pernah benar-benar membuat animasi itu.
ChrisJD
2
Terima kasih banyak atas jawaban ini, ini benar-benar didokumentasikan dengan buruk, meskipun saya menemukan posting ini melalui petunjuk dari grup Pengembang Android .
David Snabel-Caunt
3
+1 Untuk "Jika setelan animasi perangkat Anda disetel ke" Tanpa Animasi "(Setelan → Tampilan → Animasi) maka dialog tidak akan dianimasikan apa pun yang Anda lakukan!". Saya lupa memeriksanya.
Vincent Mimoun-Prat
Dialog dialog = new Dialog(this, R.style.PauseDialog);ini untuk API 11 tetapi ini umumDialog dialog = new Dialog(Context context);
mehmet
2
Masalah yang saya hadapi dalam hal ini adalah ketika saya meminimalkan aplikasi ketika dialog muncul dan mengembalikan aplikasi lagi, dialog bergerak lagi, bagaimana menghindarinya, istirahatkan dengan sempurna. +1
Parth Anjaria
56

Saya telah membuat animasi Fade in dan Fade Out untuk Dialogbox menggunakan kode ChrisJD.

  1. Di dalam res / style.xml

    <style name="AppTheme" parent="android:Theme.Light" />
    <style name="PauseDialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowAnimationStyle">@style/PauseDialogAnimation</item>
    </style>
    
    <style name="PauseDialogAnimation">
        <item name="android:windowEnterAnimation">@anim/fadein</item>
        <item name="android:windowExitAnimation">@anim/fadeout</item>
    </style>

  2. Di dalam anim / fadein.xml

    <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" />
  3. Di dalam anim / fadeout.xml

    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/anticipate_interpolator"
        android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="500" />
  4. Aktifitas utama

    Dialog imageDiaglog= new Dialog(MainActivity.this,R.style.PauseDialog);
Akshay Taru
sumber
11
Anda dapat menggunakan animasi fade android default '@android: anim / fade_in' '@android: anim / fade_out'
Marek
19

Untuk kanan ke kiri (animasi entri) dan kiri ke kanan (animasi keluar):

styles.xml:

<style name="CustomDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowAnimationStyle">@style/CustomDialogAnimation</item>
</style>

<style name="CustomDialogAnimation">
    <item name="android:windowEnterAnimation">@anim/translate_left_side</item>
    <item name="android:windowExitAnimation">@anim/translate_right_side</item>
</style>

Buat dua file di res / anim /:

translate_right_side.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="0%" android:toXDelta="100%"
    android:fromYDelta="0%" android:toYDelta="0%"
    android:duration="600"/>

translate_left_side.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="600"
    android:fromXDelta="100%"
    android:toXDelta="0%"/>

Dalam diri Anda Fragmen / Aktivitas:

Dialog dialog = new Dialog(getActivity(), R.style.CustomDialog);
vasanth
sumber
13

Saya menemui masalah yang sama, tetapi, akhirnya saya menyelesaikan masalah tersebut dengan cara yang diikuti

((ViewGroup)dialog.getWindow().getDecorView())
.getChildAt(0).startAnimation(AnimationUtils.loadAnimation(
context,android.R.anim.slide_in_left));
youshuang
sumber
4
Bukan jawaban yang masuk akal. Tampilan di dalam dialog mendapat animasi
DJphy
12

Pertama, Anda harus membuat dua sumber animasi di res / anim dir

slide_up.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:duration="@android:integer/config_mediumAnimTime"
    android:fromYDelta="100%"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:toXDelta="0">
</translate>
</set>

slide_bottom.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate 
    android:duration="@android:integer/config_mediumAnimTime" 
    android:fromYDelta="0%p" 
    android:interpolator="@android:anim/accelerate_interpolator" 
    android:toYDelta="100%p">
</translate>
</set>

maka Anda harus membuat gaya

<style name="DialogAnimation">
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <item name="android:windowExitAnimation">@anim/slide_bottom</item>
</style>

dan tambahkan baris ini ke kelas Anda

dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; //style id

Berbasis di http://www.devexchanges.info/2015/10/showing-dialog-with-animation-in-android.html

Arena Argel Ortiz
sumber
URL referensi berguna!
ahmednabil88
2

Coba kode di bawah ini:

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));// set transparent in window background

        View _v = inflater.inflate(R.layout.some_you_layout, container, false);

        //load animation
        //Animation transition_in_view = AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_in);// system animation appearance
        Animation transition_in_view = AnimationUtils.loadAnimation(getContext(), R.anim.customer_anim);//customer animation appearance

        _v.setAnimation( transition_in_view );
        _v.startAnimation( transition_in_view );
        //really beautiful
        return _v;

    }

Buat Anim khusus .: res / anim / customer_anim.xml:

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

    <translate
        android:duration="500"
        android:fromYDelta="100%"
        android:toYDelta="-7%"/>
    <translate
        android:duration="300"
        android:startOffset="500"
        android:toYDelta="7%" />
    <translate
        android:duration="200"
        android:startOffset="800"
        android:toYDelta="0%" />

</set>
amiron
sumber