android - 在关闭之前更改 DialogFragment 进入/退出转换

标签 android android-animation buttonclick dialogfragment

我有一个 DialogFragment,我在 onActivityCreated 方法中设置了进入/退出动画,如下所示:

  @Override
    public void onActivityCreated(Bundle arg0) {
        super.onActivityCreated(arg0);
        getDialog().getWindow()
                .getAttributes().windowAnimations = R.style.DialogAnimation;
    }

我的DialogAnimation样式文件如下:

<style name="DialogAnimation">
        <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
        <item name="android:windowExitAnimation">@android:anim/fade_out</item>
    </style>

这对我有用...

现在我的问题是我想要两个不同的退出动画,一个用于单击“确定”按钮,一个用于取消按钮。所以我所做的就是在解雇之前尝试更改过渡,但没有奏效。

有什么办法可以实现吗?

这是我尝试过的:

  @Override
    public void onClick(View v) {
        getDialog().getWindow()
                .getAttributes().windowAnimations = R.style.DialogAnimation2;
        this.dismiss();
    }

最佳答案

您可以在 DialogFragment 中执行此操作,无需更改

getDialog().getWindow()
            .getAttributes().windowAnimations

您应该在 onStart 和 onClick 中为“装饰 View ”设置动画。

这是截取的代码:

先创建对话框

@Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
                .setTitle("Hello from animated dialog :)")
                .setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                //we have to add button here and then override it's click in onStart
                            }
                        }
                )
                .setCancelable(false)
                .create();
    }

然后重写 onStart 方法

@Override
    public void onStart() {
        super.onStart();

        AlertDialog dialog = (AlertDialog)getDialog();

        final View decorView = getDialog()
                .getWindow()
                .getDecorView();

        ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(decorView,
                PropertyValuesHolder.ofFloat("scaleX", 0.0f, 1.0f),
                PropertyValuesHolder.ofFloat("scaleY", 0.0f, 1.0f),
                PropertyValuesHolder.ofFloat("alpha", 0.0f, 1.0f));
        scaleDown.setDuration(2000);
        scaleDown.start();


        Button positiveButton = dialog.getButton(Dialog.BUTTON_NEGATIVE);
        positiveButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                final View decorView = getDialog()
                        .getWindow()
                        .getDecorView();

                ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(decorView,
                        PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f),
                        PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f),
                        PropertyValuesHolder.ofFloat("alpha", 1.0f, 0.0f));
                scaleDown.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        dismiss();
                    }

                    @Override
                    public void onAnimationStart(Animator animation) {
                    }
                    @Override
                    public void onAnimationCancel(Animator animation) {
                    }
                    @Override
                    public void onAnimationRepeat(Animator animation) {
                    }
                });
                scaleDown.setDuration(2000);
                scaleDown.start();
            }
        });
    }

这是结果动画

Demo of the result


如果您从我的代码中删除缩放属性,您将只获得 alpha 动画。完全如您所愿。

删除这个:

PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f),
PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f),

关于android - 在关闭之前更改 DialogFragment 进入/退出转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32908279/

相关文章:

java - 在 styles.xml 文件中为所有按钮声明一个通用的 onClick 属性

android - 内容提供者的应用程序如何指定客户端应用程序访问提供者数据所需的权限?

android-maven-插件 : deploy method that does not delete SharedPreferences

android - 使用 Jetpack Compose for Android 动画形状

android - 如何高效翻译一组观点?

asp.net - updatepanel 内的按钮导致整个页面刷新

android - 如何将 flutter 项目迁移到 androidx

android - IBM Worklight 5.0.6 - 推送通知错误 : "Error while trying to retrieve device token from the mobile operating system"

android - 在 Android 中向自定义 View 添加动画的最佳方式

javascript - 使用循环创建Word Scrambler