2011-01-27 2 views
78

Я пытаюсь создать собственное диалоговое окно, как будто оно сползает с текстового вида. Это возможно? Я не могу применить анимацию к классу диалога. Я пробовал эту строку в конструкторе, но не имеет никакого эффекта:Анимировать пользовательский диалог

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

Я даже не уверен, что анимация правильная, но я смогу ее отрегулировать, как только увижу, что она делает. Я перечислил его ниже ради полноты. Я не ищу помощь в реальной анимации, просто приложение в диалоговом окне.

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> 
+3

Мне также нужно знать это. Кажется возможным анимировать практически все, кроме этого. Или я ошибаюсь ?! –

ответ

180

Я боролся с диалоговой анимацией сегодня, наконец, получил это работает, используя стили, так вот пример.

Для начала самое главное - у меня, наверное, сегодня было 5 разных способов, но не могу сказать, потому что ... Если для настроек анимации ваших устройств установлено значение «Без анимации» (Настройки → Экран → Анимация) то диалоги не будут анимированы независимо от того, что вы делаете!

Следующая урезанная версия моих styles.xml. Надеюсь, это самоочевидно. Это должно быть расположено в 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> 

windowEnterAnimation это один из моих анимации и находится в res\anim. windowExitAnimation - одна из анимаций, которая является частью Android SDK.

Затем, когда я создаю диалог в своих действиях onCreateDialog(int id) метод, я делаю следующее.

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

В качестве альтернативы вы можете настроить анимацию следующим образом, вместо использования конструктора диалога, который принимает тему.

Dialog dialog = new Dialog(this); 
dialog.getWindow().getAttributes().windowAnimations = R.style.PauseDialogAnimation; 
+0

Отличная вещь! не мог бы поставить код для @ anim/spin_in? – Neutralizer

+2

Это было просто имя, которое я придумал для этого примера, я никогда не создавал эту анимацию. – ChrisJD

+2

Большое спасибо за этот ответ, это очень плохо документировано, хотя я нашел этот пост по подсказке разработчиков Android (http://groups.google.com/group/android-developers/browse_thread/thread/d28096a900b83f0c) группа. –

42

Я создал анимацию Fade in и Fade Out для Dialogbox с использованием кода ChrisJD.

  1. Внутри разреш/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. Внутри Аним/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. Внутри Anim/fadeut.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. MainActivity

    Dialog imageDiaglog= new Dialog(MainActivity.this,R.style.PauseDialog); 
    
+8

Вы можете использовать анимацию fade по умолчанию android fand: @android: anim/fade_in '' @android: anim/fade_out ' – Marek

+0

Анимация не работает в диалоговом окне. – portfoliobuilder

7

Я встречаюсь с такой же проблемой, но, наконец, я могу решить эту проблему, последовавшей образом

((ViewGroup)dialog.getWindow().getDecorView()) 
.getChildAt(0).startAnimation(AnimationUtils.loadAnimation(
context,android.R.anim.slide_in_left)); 
+4

Не разумный ответ. Представления внутри диалогового окна становятся анимированными – DJphy

14

Для справа налево (анимация ввода) и слева направо (анимация выхода):

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> 

Создать два файла в Рез/Аним /:

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

В вас Фрагмент/Деятельность:

Dialog dialog = new Dialog(getActivity(), R.style.CustomDialog); 
Смежные вопросы