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

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

Я пытался, но это не сработало

alert.setOnCancelListener()
alert.setOnDismissListener()

вот мой код:

View rl = getActivity().findViewById(R.id.map) ;

                AlertDialog.Builder alert = new 
AlertDialog.Builder(rl.getContext(), R.style.CFDialog);
                LayoutInflater inflater = 
getActivity().getLayoutInflater();
                View v = 
inflater.inflate(R.layout.dialog_footer_layout, null);

                Animation transition_in_view = 
AnimationUtils.loadAnimation(rl.getContext(), 
R.anim.alert_present);
                Animation transition_out_view = 
AnimationUtils.loadAnimation(rl.getContext(), 
R.anim.alert_dismiss);

                //customer animation appearance

                v.setAnimation( transition_in_view );
                v.startAnimation( transition_in_view );

                alert.setView(v);
                alert.setOnCancelListener(new 
DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel(DialogInterface 
dialogInterface) {

                        v.startAnimation(transition_out_view);

                    }
                });

                alert.setOnDismissListener()
                Button button = 
v.findViewById(R.id.configuration_toggle_button);

                AlertDialog helpDialog = alert.create();
                button.setOnClickListener(new 
View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        v.startAnimation(transition_out_view);

transition_out_view.setAnimationListener(new 
Animation.AnimationListener() {
                            @Override
                            public void onAnimationStart(Animation 
animation) {

                            }

                            @Override
                            public void onAnimationEnd(Animation 
animation) {

                                helpDialog.dismiss();

                            }

                            @Override
                            public void onAnimationRepeat(Animation 
animation) {

                            }
                        });

                    }
                });

                helpDialog.setOnCancelListener(new 
DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel(DialogInterface 
dialogInterface) {
                        v.startAnimation(transition_out_view);
                        return;
                    }
                });

                helpDialog.setOnDismissListener(new 
DialogInterface.OnDismissListener() {
                    @Override
                    public void onDismiss(DialogInterface 
dialogInterface) {
                        v.startAnimation(transition_out_view);
                        return;
                    }
                });

                // Hide after some seconds
                final Handler handler  = new Handler();
                final Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        if (helpDialog.isShowing()) {

                            v.startAnimation(transition_out_view);

transition_out_view.setAnimationListener(new 
Animation.AnimationListener() {
                                @Override
                                public void 
onAnimationStart(Animation animation) {

                                }

                                @Override
                                public void 
onAnimationEnd(Animation animation) {

                                    helpDialog.dismiss();

                                }

                                @Override
                                public void 
onAnimationRepeat(Animation animation) {

                                }
                            });
                        }
                    }
                };

                alert.setOnDismissListener(new 
DialogInterface.OnDismissListener() {
                    @Override
                    public void onDismiss(DialogInterface dialog) {
                        handler.removeCallbacks(runnable);
                    }
                });


                handler.postDelayed(runnable, 5000);



helpDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                WindowManager.LayoutParams wmlp = 
helpDialog.getWindow().getAttributes();


                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
                {
                    wmlp.gravity = Gravity.TOP;

                    wmlp.y = 200;   //y position
                    helpDialog.show();
                } else {

//                        if (Build.VERSION.SDK_INT <= 
Build.VERSION_CODES.O)

                    wmlp.gravity = Gravity.TOP;

                    wmlp.y = 180;   //y position
                    helpDialog.show();

                }

Вот стиль диалога:

<style name="CFDialog" parent="Theme.AppCompat.Translucent">
    <item name="android:backgroundDimEnabled">false</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimAmount">0.5</item>
    <item name="colorPrimaryDark">@color/transparent</item>
    <item name="android:windowMinWidthMajor">100%</item>
    <item name="android:windowMinWidthMinor">100%</item>

person NewCEO    schedule 13.06.2019    source источник


Ответы (1)


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

После недели попыток найти решение я нашел способ переопределить значение по умолчанию dialog.setCanceledOnTouchOutside(true) и установить для него анимацию.

Вот что я сделал. Я изучаю http://iserveandroid.blogspot.com/2011/04/how-to-dismiss-your-non-modal-dialog.html и отсюда я смог найти, как добавить анимацию в FLAG_WATCH_OUTSIDE_TOUCH, и наткнулся на этот WindowManager с анимацией (возможно ли это?)

Отсюда я смог реализовать это wmlp.windowAnimations = R.style.CFDialog_Animation;

Вот мой код:

AlertDialog helpDialog = alert.create();

helpDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                WindowManager.LayoutParams wmlp = 
helpDialog.getWindow().getAttributes();


                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
                {
                    wmlp.gravity = Gravity.TOP;

                    wmlp.y = 200;   //y position
                    helpDialog.show();
                } else {

//                        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O)

                    wmlp.gravity = Gravity.TOP;
                    wmlp.y = 180;   //y position
                    helpDialog.show();

                }

                //this code below is what overrides it and add the animation

                wmlp.windowAnimations = R.style.CFDialog_Animation; 




        ///optional, your preference

 Window window = helpDialog.getWindow();

window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
                        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);

window.setFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                        WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);

Я также использую дополнительные коды, чтобы сделать его не моделью, чтобы его можно было отменить/отклонить, когда вы касаетесь объекта вне диалогового окна (необязательно)

Теперь, когда вы щелкаете за пределами диалогового окна, оно скользит вверх. Конечно, вы можете использовать свою собственную анимацию. wmlp.windowAnimations = android.R.style.Animation_Translucent; заставляет его уйти в сторону. Я не знаю почему.

Вот мой стиль:

<style name="CFDialog.Animation">

    <item name="android:windowExitAnimation">@anim/alert_dismiss</item>
</style>

и анимация alert_dimiss

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

<alpha
    android:interpolator="@android:anim/anticipate_interpolator"
    android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="1000" />

<translate android:fromYDelta="00%" android:toYDelta="-100%" 
android:duration="500"/>
</set>

Надеюсь, это поможет другим найти решение

person NewCEO    schedule 14.06.2019