动画自定义对话框


97

我正在尝试显示自定义对话框,就像它从文本视图中滑落一样。这可能吗?我似乎无法将任何动画应用于对话框类。我已经在构造函数中尝试过这一行,但是没有效果:

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>

4
我也要知道这一点。除此之外,似乎几乎可以制作任何东西的动画。还是我错了?
andy_spoo 2011年

Answers:


215

今天,我一直在努力地使用Dialog动画,最后使它使用样式工作,因此这里是一个示例。

首先,最重要的事情是-我今天可能已经用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 dialog = new Dialog(this);
dialog.getWindow().getAttributes().windowAnimations = R.style.PauseDialogAnimation;

2
那只是我为该示例制作的名称,我从未真正创建过该动画。
克里斯·贾德

2
非常感谢您提供此答案,尽管我通过Android开发者小组的线索找到了这篇文章,但它的文献记录确实很少。
David Snabel-Caunt 2011年

3
+1对于“如果您的设备将动画设置设置为“无动画”(设置→显示→动画),则无论您做什么,对话框都不会动画!”。我忘了检查。
2013年

Dialog dialog = new Dialog(this, R.style.PauseDialog);它是针对API 11的,但这是通用的Dialog dialog = new Dialog(Context context);
2014年

2
我面临的问题是,当我在显示对话框时最小化应用程序并再次还原应用程序时,对话框会再次设置动画,如何避免这种情况,保持其完美。+1
Parth Anjaria '16

56

我已经使用ChrisJD代码为对话框创建了淡入淡出动画。

  1. 内部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. 里面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. 里面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. 主要活动

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

11
您可以使用默认的android淡入淡出动画'@android:anim / fade_in''@android:anim / fade_out'–
Marek

19

对于从右到左(进入动画)和从左到右(退出动画):

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>

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

在您的片段/活动中:

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

13

我遇到同样的问题,但是最后我按照以下方法解决了问题

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

4
没有一个明智的答案。对话框中的视图动画化
DJphy 2016年

12

首先,您必须在res / anim目录中创建两个动画资源

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>

那么你必须创造一个风格

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

并将这一行添加到您的班级

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

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


参考网址很有用!
ahmednabil88 '19

2

试试下面的代码:

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;

    }

创建自定义动画: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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.