Как добавить анимацию в диалоговое окно оповещения, когда оно закрывается при прикосновении снаружи - PullRequest
0 голосов
/ 13 июня 2019

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

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

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>

1 Ответ

0 голосов
/ 15 июня 2019

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

После недели попыток найти решение я нашел способ переопределить значение по умолчанию 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>

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

...