kongzue vor 3 Jahren
Ursprung
Commit
8b8b460b66

+ 38 - 41
DialogX/src/main/java/com/kongzue/dialogx/dialogs/BottomDialog.java

@@ -1,20 +1,16 @@
 package com.kongzue.dialogx.dialogs;
 
-import android.animation.Animator;
 import android.animation.ObjectAnimator;
 import android.animation.ValueAnimator;
 import android.app.Activity;
-import android.content.res.Configuration;
 import android.os.Handler;
 import android.os.Looper;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
-import android.view.animation.AccelerateInterpolator;
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
 import android.view.animation.DecelerateInterpolator;
-import android.view.inputmethod.InputMethodManager;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.RelativeLayout;
@@ -22,11 +18,9 @@ import android.widget.TextView;
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.ColorRes;
-import androidx.core.view.ViewCompat;
 
 import com.kongzue.dialogx.DialogX;
 import com.kongzue.dialogx.R;
-import com.kongzue.dialogx.impl.AnimatorListenerEndCallBack;
 import com.kongzue.dialogx.interfaces.BaseDialog;
 import com.kongzue.dialogx.interfaces.DialogConvertViewInterface;
 import com.kongzue.dialogx.interfaces.DialogLifecycleCallback;
@@ -604,43 +598,46 @@ public class BottomDialog extends BaseDialog {
         public void doDismiss(View v) {
             if (v != null) v.setEnabled(false);
             if (getContext() == null) return;
-            
-            if (boxContent != null) {
-                boxContent.getViewTreeObserver().removeOnGlobalLayoutListener(onContentViewLayoutChangeListener);
-            }
-            
-            long exitAnimDurationTemp = 300;
-            if (overrideExitDuration >= 0) {
-                exitAnimDurationTemp = overrideExitDuration;
-            }
-            if (exitAnimDuration >= 0) {
-                exitAnimDurationTemp = exitAnimDuration;
-            }
-            
-            ObjectAnimator exitAnim = ObjectAnimator.ofFloat(bkg, "y", bkg.getY(), boxBkg.getHeight());
-            exitAnim.setDuration(exitAnimDurationTemp);
-            exitAnim.start();
-            
-            ValueAnimator bkgAlpha = ValueAnimator.ofFloat(1f, 0f);
-            bkgAlpha.setDuration(exitAnimDurationTemp);
-            bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
-                @Override
-                public void onAnimationUpdate(ValueAnimator animation) {
-                    if (boxRoot != null) {
-                        float value = (float) animation.getAnimatedValue();
-                        boxRoot.setBkgAlpha(value);
-                        if (value == 0) boxRoot.setVisibility(View.GONE);
-                    }
+    
+            if (!dismissAnimFlag) {
+                dismissAnimFlag = true;
+                if (boxContent != null) {
+                    boxContent.getViewTreeObserver().removeOnGlobalLayoutListener(onContentViewLayoutChangeListener);
                 }
-            });
-            bkgAlpha.start();
-            
-            new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
-                @Override
-                public void run() {
-                    dismiss(dialogView);
+    
+                long exitAnimDurationTemp = 300;
+                if (overrideExitDuration >= 0) {
+                    exitAnimDurationTemp = overrideExitDuration;
                 }
-            }, exitAnimDurationTemp);
+                if (exitAnimDuration >= 0) {
+                    exitAnimDurationTemp = exitAnimDuration;
+                }
+    
+                ObjectAnimator exitAnim = ObjectAnimator.ofFloat(bkg, "y", bkg.getY(), boxBkg.getHeight());
+                exitAnim.setDuration(exitAnimDurationTemp);
+                exitAnim.start();
+    
+                ValueAnimator bkgAlpha = ValueAnimator.ofFloat(1f, 0f);
+                bkgAlpha.setDuration(exitAnimDurationTemp);
+                bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+                    @Override
+                    public void onAnimationUpdate(ValueAnimator animation) {
+                        if (boxRoot != null) {
+                            float value = (float) animation.getAnimatedValue();
+                            boxRoot.setBkgAlpha(value);
+                            if (value == 0) boxRoot.setVisibility(View.GONE);
+                        }
+                    }
+                });
+                bkgAlpha.start();
+    
+                new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        dismiss(dialogView);
+                    }
+                }, exitAnimDurationTemp);
+            }
         }
         
         public void preDismiss() {

+ 57 - 58
DialogX/src/main/java/com/kongzue/dialogx/dialogs/CustomDialog.java

@@ -2,11 +2,8 @@ package com.kongzue.dialogx.dialogs;
 
 import android.animation.ValueAnimator;
 import android.app.Activity;
-import android.content.Context;
-import android.content.res.Configuration;
 import android.graphics.Color;
 import android.view.View;
-import android.view.ViewGroup;
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
 import android.view.animation.DecelerateInterpolator;
@@ -278,68 +275,70 @@ public class CustomDialog extends BaseDialog {
         @Override
         public void doDismiss(View v) {
             if (v != null) v.setEnabled(false);
-            
-            boxCustom.post(new Runnable() {
-                @Override
-                public void run() {
-                    int exitAnimResIdTemp = R.anim.anim_dialogx_default_exit;
-                    if (overrideExitAnimRes != 0) {
-                        exitAnimResIdTemp = overrideExitAnimRes;
-                    }
-                    if (exitAnimResId != 0) {
-                        exitAnimResIdTemp = exitAnimResId;
-                    }
-                    
-                    Animation exitAnim = AnimationUtils.loadAnimation(getContext() == null ? boxCustom.getContext() : getContext(), exitAnimResIdTemp);
-                    
-                    long exitAnimDurationTemp = exitAnim.getDuration();
-                    if (overrideExitDuration >= 0) {
-                        exitAnimDurationTemp = overrideExitDuration;
-                    }
-                    if (exitAnimDuration >= 0) {
-                        exitAnimDurationTemp = exitAnimDuration;
-                    }
-                    exitAnim.setDuration(exitAnimDurationTemp);
-                    exitAnim.setAnimationListener(new Animation.AnimationListener() {
-                        @Override
-                        public void onAnimationStart(Animation animation) {
-                        
+            if (!dismissAnimFlag){
+                dismissAnimFlag = true;
+                boxCustom.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        int exitAnimResIdTemp = R.anim.anim_dialogx_default_exit;
+                        if (overrideExitAnimRes != 0) {
+                            exitAnimResIdTemp = overrideExitAnimRes;
                         }
-                        
-                        @Override
-                        public void onAnimationEnd(Animation animation) {
-                            dismiss(dialogView);
+                        if (exitAnimResId != 0) {
+                            exitAnimResIdTemp = exitAnimResId;
                         }
-                        
-                        @Override
-                        public void onAnimationRepeat(Animation animation) {
-                        
+            
+                        Animation exitAnim = AnimationUtils.loadAnimation(getContext() == null ? boxCustom.getContext() : getContext(), exitAnimResIdTemp);
+            
+                        long exitAnimDurationTemp = exitAnim.getDuration();
+                        if (overrideExitDuration >= 0) {
+                            exitAnimDurationTemp = overrideExitDuration;
                         }
-                    });
-                    boxCustom.startAnimation(exitAnim);
+                        if (exitAnimDuration >= 0) {
+                            exitAnimDurationTemp = exitAnimDuration;
+                        }
+                        exitAnim.setDuration(exitAnimDurationTemp);
+                        exitAnim.setAnimationListener(new Animation.AnimationListener() {
+                            @Override
+                            public void onAnimationStart(Animation animation) {
                     
-                    if (overrideMaskExitAnimRes != 0) {
-                        Animation maskExitAnim = AnimationUtils.loadAnimation(getContext(), overrideMaskExitAnimRes);
-                        maskExitAnim.setDuration(exitAnimDurationTemp);
-                        maskExitAnim.setInterpolator(new DecelerateInterpolator(2f));
-                        boxRoot.startAnimation(maskExitAnim);
-                    }
+                            }
+                
+                            @Override
+                            public void onAnimationEnd(Animation animation) {
+                                dismiss(dialogView);
+                            }
+                
+                            @Override
+                            public void onAnimationRepeat(Animation animation) {
                     
-                    ValueAnimator bkgAlpha = ValueAnimator.ofFloat(1f, 0f);
-                    bkgAlpha.setDuration(exitAnimDurationTemp);
-                    bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
-                        @Override
-                        public void onAnimationUpdate(ValueAnimator animation) {
-                            if (boxRoot != null) {
-                                float value = (float) animation.getAnimatedValue();
-                                boxRoot.setBkgAlpha(value);
-                                if (value == 0) boxRoot.setVisibility(View.GONE);
                             }
+                        });
+                        boxCustom.startAnimation(exitAnim);
+            
+                        if (overrideMaskExitAnimRes != 0) {
+                            Animation maskExitAnim = AnimationUtils.loadAnimation(getContext(), overrideMaskExitAnimRes);
+                            maskExitAnim.setDuration(exitAnimDurationTemp);
+                            maskExitAnim.setInterpolator(new DecelerateInterpolator(2f));
+                            boxRoot.startAnimation(maskExitAnim);
                         }
-                    });
-                    bkgAlpha.start();
-                }
-            });
+            
+                        ValueAnimator bkgAlpha = ValueAnimator.ofFloat(1f, 0f);
+                        bkgAlpha.setDuration(exitAnimDurationTemp);
+                        bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+                            @Override
+                            public void onAnimationUpdate(ValueAnimator animation) {
+                                if (boxRoot != null) {
+                                    float value = (float) animation.getAnimatedValue();
+                                    boxRoot.setBkgAlpha(value);
+                                    if (value == 0) boxRoot.setVisibility(View.GONE);
+                                }
+                            }
+                        });
+                        bkgAlpha.start();
+                    }
+                });
+            }
         }
     }
     

+ 34 - 31
DialogX/src/main/java/com/kongzue/dialogx/dialogs/FullScreenDialog.java

@@ -276,39 +276,42 @@ public class FullScreenDialog extends BaseDialog {
         public void doDismiss(View v) {
             if (v != null) v.setEnabled(false);
             if (getContext() == null) return;
-            
-            long exitAnimDurationTemp = 300;
-            if (overrideExitDuration >= 0) {
-                exitAnimDurationTemp = overrideExitDuration;
-            }
-            if (exitAnimDuration >= 0) {
-                exitAnimDurationTemp = exitAnimDuration;
-            }
-            
-            ObjectAnimator exitAnim = ObjectAnimator.ofFloat(bkg, "y", bkg.getY(), boxBkg.getHeight());
-            exitAnim.setDuration(exitAnimDurationTemp);
-            exitAnim.start();
-            
-            ValueAnimator bkgAlpha = ValueAnimator.ofFloat(1f, 0f);
-            bkgAlpha.setDuration(exitAnimDurationTemp);
-            bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
-                @Override
-                public void onAnimationUpdate(ValueAnimator animation) {
-                    if (boxRoot != null) {
-                        float value = (float) animation.getAnimatedValue();
-                        boxRoot.setBkgAlpha(value);
-                        if (value == 0) boxRoot.setVisibility(View.GONE);
-                    }
+    
+            if (!dismissAnimFlag) {
+                dismissAnimFlag = true;
+                long exitAnimDurationTemp = 300;
+                if (overrideExitDuration >= 0) {
+                    exitAnimDurationTemp = overrideExitDuration;
                 }
-            });
-            bkgAlpha.start();
-            
-            new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
-                @Override
-                public void run() {
-                    dismiss(dialogView);
+                if (exitAnimDuration >= 0) {
+                    exitAnimDurationTemp = exitAnimDuration;
                 }
-            }, exitAnimDurationTemp);
+    
+                ObjectAnimator exitAnim = ObjectAnimator.ofFloat(bkg, "y", bkg.getY(), boxBkg.getHeight());
+                exitAnim.setDuration(exitAnimDurationTemp);
+                exitAnim.start();
+    
+                ValueAnimator bkgAlpha = ValueAnimator.ofFloat(1f, 0f);
+                bkgAlpha.setDuration(exitAnimDurationTemp);
+                bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+                    @Override
+                    public void onAnimationUpdate(ValueAnimator animation) {
+                        if (boxRoot != null) {
+                            float value = (float) animation.getAnimatedValue();
+                            boxRoot.setBkgAlpha(value);
+                            if (value == 0) boxRoot.setVisibility(View.GONE);
+                        }
+                    }
+                });
+                bkgAlpha.start();
+    
+                new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        dismiss(dialogView);
+                    }
+                }, exitAnimDurationTemp);
+            }
         }
         
         public void preDismiss() {

+ 40 - 37
DialogX/src/main/java/com/kongzue/dialogx/dialogs/MessageDialog.java

@@ -658,45 +658,48 @@ public class MessageDialog extends BaseDialog {
             if (v != null) v.setEnabled(false);
             if (getContext() == null) return;
             
-            int exitAnimResId = style.exitAnimResId() == 0 ? R.anim.anim_dialogx_default_exit : style.exitAnimResId();
-            if (overrideExitAnimRes != 0) {
-                exitAnimResId = overrideExitAnimRes;
-            }
-            if (customExitAnimResId != 0) {
-                exitAnimResId = customExitAnimResId;
-            }
-            Animation exitAnim = AnimationUtils.loadAnimation(getContext(), exitAnimResId);
-            long exitAnimDurationTemp = exitAnim.getDuration();
-            exitAnim.setInterpolator(new AccelerateInterpolator());
-            if (overrideExitDuration >= 0) {
-                exitAnimDurationTemp = overrideExitDuration;
-            }
-            if (exitAnimDuration >= 0) {
-                exitAnimDurationTemp = exitAnimDuration;
-            }
-            exitAnim.setDuration(exitAnimDurationTemp);
-            bkg.startAnimation(exitAnim);
-            
-            ValueAnimator bkgAlpha = ValueAnimator.ofFloat(1f, 0f);
-            bkgAlpha.setDuration(exitAnimDurationTemp);
-            bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
-                @Override
-                public void onAnimationUpdate(ValueAnimator animation) {
-                    if (boxRoot != null) {
-                        float value = (float) animation.getAnimatedValue();
-                        boxRoot.setBkgAlpha(value);
-                        if (value == 0) boxRoot.setVisibility(View.GONE);
-                    }
+            if (!dismissAnimFlag) {
+                dismissAnimFlag = true;
+                int exitAnimResId = style.exitAnimResId() == 0 ? R.anim.anim_dialogx_default_exit : style.exitAnimResId();
+                if (overrideExitAnimRes != 0) {
+                    exitAnimResId = overrideExitAnimRes;
                 }
-            });
-            bkgAlpha.start();
-            
-            new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
-                @Override
-                public void run() {
-                    dismiss(dialogView);
+                if (customExitAnimResId != 0) {
+                    exitAnimResId = customExitAnimResId;
+                }
+                Animation exitAnim = AnimationUtils.loadAnimation(getContext(), exitAnimResId);
+                long exitAnimDurationTemp = exitAnim.getDuration();
+                exitAnim.setInterpolator(new AccelerateInterpolator());
+                if (overrideExitDuration >= 0) {
+                    exitAnimDurationTemp = overrideExitDuration;
+                }
+                if (exitAnimDuration >= 0) {
+                    exitAnimDurationTemp = exitAnimDuration;
                 }
-            }, exitAnimDurationTemp);
+                exitAnim.setDuration(exitAnimDurationTemp);
+                bkg.startAnimation(exitAnim);
+                
+                ValueAnimator bkgAlpha = ValueAnimator.ofFloat(1f, 0f);
+                bkgAlpha.setDuration(exitAnimDurationTemp);
+                bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+                    @Override
+                    public void onAnimationUpdate(ValueAnimator animation) {
+                        if (boxRoot != null) {
+                            float value = (float) animation.getAnimatedValue();
+                            boxRoot.setBkgAlpha(value);
+                            if (value == 0) boxRoot.setVisibility(View.GONE);
+                        }
+                    }
+                });
+                bkgAlpha.start();
+                
+                new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        dismiss(dialogView);
+                    }
+                }, exitAnimDurationTemp);
+            }
         }
     }
     

+ 39 - 35
DialogX/src/main/java/com/kongzue/dialogx/dialogs/PopMenu.java

@@ -471,44 +471,48 @@ public class PopMenu extends BaseDialog {
         
         @Override
         public void doDismiss(View v) {
-            boxRoot.post(new Runnable() {
-                @Override
-                public void run() {
-                    if (v != null) v.setEnabled(false);
-                    
-                    if (overrideExitDuration != -1) exitAnimDuration = overrideExitDuration;
-                    Animation exitAnim = AnimationUtils.loadAnimation(getContext() == null ? boxRoot.getContext() : getContext(), R.anim.anim_dialogx_default_exit);
-                    if (exitAnimDuration != -1) {
-                        exitAnim.setDuration(exitAnimDuration);
-                    }
-                    boxBody.startAnimation(exitAnim);
-                    
-                    boxRoot.animate()
-                            .alpha(0f)
-                            .setInterpolator(new AccelerateInterpolator())
-                            .setDuration(exitAnimDuration == -1 ? exitAnim.getDuration() : exitAnimDuration);
-                    
-                    if (baseView == null) {
-                        ValueAnimator bkgAlpha = ValueAnimator.ofFloat(1, 0f);
-                        bkgAlpha.setDuration(exitAnimDuration == -1 ? exitAnim.getDuration() : exitAnimDuration);
-                        bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+            if (v != null) v.setEnabled(false);
+    
+            if (!dismissAnimFlag) {
+                dismissAnimFlag = true;
+                boxRoot.post(new Runnable() {
+                    @Override
+                    public void run() {
+            
+                        if (overrideExitDuration != -1) exitAnimDuration = overrideExitDuration;
+                        Animation exitAnim = AnimationUtils.loadAnimation(getContext() == null ? boxRoot.getContext() : getContext(), R.anim.anim_dialogx_default_exit);
+                        if (exitAnimDuration != -1) {
+                            exitAnim.setDuration(exitAnimDuration);
+                        }
+                        boxBody.startAnimation(exitAnim);
+            
+                        boxRoot.animate()
+                                .alpha(0f)
+                                .setInterpolator(new AccelerateInterpolator())
+                                .setDuration(exitAnimDuration == -1 ? exitAnim.getDuration() : exitAnimDuration);
+            
+                        if (baseView == null) {
+                            ValueAnimator bkgAlpha = ValueAnimator.ofFloat(1, 0f);
+                            bkgAlpha.setDuration(exitAnimDuration == -1 ? exitAnim.getDuration() : exitAnimDuration);
+                            bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+                                @Override
+                                public void onAnimationUpdate(ValueAnimator animation) {
+                                    float value = (float) animation.getAnimatedValue();
+                                    boxRoot.setBkgAlpha(value);
+                                }
+                            });
+                            bkgAlpha.start();
+                        }
+            
+                        new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                             @Override
-                            public void onAnimationUpdate(ValueAnimator animation) {
-                                float value = (float) animation.getAnimatedValue();
-                                boxRoot.setBkgAlpha(value);
+                            public void run() {
+                                dismiss(dialogView);
                             }
-                        });
-                        bkgAlpha.start();
+                        }, exitAnimDuration == -1 ? exitAnim.getDuration() : exitAnimDuration);
                     }
-                    
-                    new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
-                        @Override
-                        public void run() {
-                            dismiss(dialogView);
-                        }
-                    }, exitAnimDuration == -1 ? exitAnim.getDuration() : exitAnimDuration);
-                }
-            });
+                });
+            }
         }
     }
     

+ 28 - 24
DialogX/src/main/java/com/kongzue/dialogx/dialogs/PopTip.java

@@ -587,31 +587,35 @@ public class PopTip extends BaseDialog {
         
         @Override
         public void doDismiss(final View v) {
-            boxRoot.post(new Runnable() {
-                @Override
-                public void run() {
-                    if (v != null) v.setEnabled(false);
-                    
-                    Animation exitAnim = AnimationUtils.loadAnimation(getContext() == null ? boxRoot.getContext() : getContext(), exitAnimResId == 0 ? R.anim.anim_dialogx_default_exit : exitAnimResId);
-                    if (exitAnimDuration != -1) {
-                        exitAnim.setDuration(exitAnimDuration);
-                    }
-                    exitAnim.setFillAfter(true);
-                    boxBody.startAnimation(exitAnim);
-                    
-                    boxRoot.animate()
-                            .alpha(0f)
-                            .setInterpolator(new AccelerateInterpolator())
-                            .setDuration(exitAnimDuration == -1 ? exitAnim.getDuration() : exitAnimDuration);
-                    
-                    new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
-                        @Override
-                        public void run() {
-                            waitForDismiss();
+            if (v != null) v.setEnabled(false);
+    
+            if (!dismissAnimFlag) {
+                dismissAnimFlag = true;
+                boxRoot.post(new Runnable() {
+                    @Override
+                    public void run() {
+            
+                        Animation exitAnim = AnimationUtils.loadAnimation(getContext() == null ? boxRoot.getContext() : getContext(), exitAnimResId == 0 ? R.anim.anim_dialogx_default_exit : exitAnimResId);
+                        if (exitAnimDuration != -1) {
+                            exitAnim.setDuration(exitAnimDuration);
                         }
-                    }, exitAnimDuration == -1 ? exitAnim.getDuration() : exitAnimDuration);
-                }
-            });
+                        exitAnim.setFillAfter(true);
+                        boxBody.startAnimation(exitAnim);
+            
+                        boxRoot.animate()
+                                .alpha(0f)
+                                .setInterpolator(new AccelerateInterpolator())
+                                .setDuration(exitAnimDuration == -1 ? exitAnim.getDuration() : exitAnimDuration);
+            
+                        new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
+                            @Override
+                            public void run() {
+                                waitForDismiss();
+                            }
+                        }, exitAnimDuration == -1 ? exitAnim.getDuration() : exitAnimDuration);
+                    }
+                });
+            }
         }
     }
     

+ 57 - 53
DialogX/src/main/java/com/kongzue/dialogx/dialogs/WaitDialog.java

@@ -471,61 +471,65 @@ public class WaitDialog extends BaseDialog {
         public void doDismiss(final View v) {
             if (boxRoot == null) return;
             if (getContext() == null) return;
-            boxRoot.post(new Runnable() {
-                @Override
-                public void run() {
-                    Context context = getContext();
-                    if (context == null) context = boxRoot.getContext();
-                    if (context == null) return;
-                    
-                    if (v != null) v.setEnabled(false);
-                    
-                    int exitAnimResId = R.anim.anim_dialogx_default_exit;
-                    if (overrideExitAnimRes != 0) {
-                        exitAnimResId = overrideExitAnimRes;
-                    }
-                    if (customExitAnimResId != 0) {
-                        exitAnimResId = customExitAnimResId;
-                    }
-                    Animation exitAnim = AnimationUtils.loadAnimation(context, exitAnimResId);
-                    long exitAnimDurationTemp = exitAnim.getDuration();
-                    if (overrideExitDuration >= 0) {
-                        exitAnimDurationTemp = overrideExitDuration;
-                    }
-                    if (exitAnimDuration != -1) {
-                        exitAnimDurationTemp = exitAnimDuration;
-                    }
-                    exitAnim.setDuration(exitAnimDurationTemp);
-                    exitAnim.setInterpolator(new AccelerateInterpolator());
-                    bkg.startAnimation(exitAnim);
-                    
-                    boxRoot.animate()
-                            .alpha(0f)
-                            .setInterpolator(new AccelerateInterpolator())
-                            .setDuration(exitAnimDurationTemp);
-                    
-                    ValueAnimator bkgAlpha = ValueAnimator.ofFloat(1f, 0f);
-                    bkgAlpha.setDuration(exitAnimDurationTemp);
-                    bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
-                        @Override
-                        public void onAnimationUpdate(ValueAnimator animation) {
-                            if (boxRoot != null) {
-                                float value = (float) animation.getAnimatedValue();
-                                boxRoot.setBkgAlpha(value);
-                                if (value == 0) boxRoot.setVisibility(View.GONE);
-                            }
+            
+            if (!dismissAnimFlag) {
+                dismissAnimFlag = true;
+                boxRoot.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        Context context = getContext();
+                        if (context == null) context = boxRoot.getContext();
+                        if (context == null) return;
+                        
+                        if (v != null) v.setEnabled(false);
+                        
+                        int exitAnimResId = R.anim.anim_dialogx_default_exit;
+                        if (overrideExitAnimRes != 0) {
+                            exitAnimResId = overrideExitAnimRes;
                         }
-                    });
-                    bkgAlpha.start();
-                    
-                    new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
-                        @Override
-                        public void run() {
-                            dismiss(getWaitDialogView());
+                        if (customExitAnimResId != 0) {
+                            exitAnimResId = customExitAnimResId;
                         }
-                    }, exitAnimDurationTemp);
-                }
-            });
+                        Animation exitAnim = AnimationUtils.loadAnimation(context, exitAnimResId);
+                        long exitAnimDurationTemp = exitAnim.getDuration();
+                        if (overrideExitDuration >= 0) {
+                            exitAnimDurationTemp = overrideExitDuration;
+                        }
+                        if (exitAnimDuration != -1) {
+                            exitAnimDurationTemp = exitAnimDuration;
+                        }
+                        exitAnim.setDuration(exitAnimDurationTemp);
+                        exitAnim.setInterpolator(new AccelerateInterpolator());
+                        bkg.startAnimation(exitAnim);
+                        
+                        boxRoot.animate()
+                                .alpha(0f)
+                                .setInterpolator(new AccelerateInterpolator())
+                                .setDuration(exitAnimDurationTemp);
+                        
+                        ValueAnimator bkgAlpha = ValueAnimator.ofFloat(1f, 0f);
+                        bkgAlpha.setDuration(exitAnimDurationTemp);
+                        bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+                            @Override
+                            public void onAnimationUpdate(ValueAnimator animation) {
+                                if (boxRoot != null) {
+                                    float value = (float) animation.getAnimatedValue();
+                                    boxRoot.setBkgAlpha(value);
+                                    if (value == 0) boxRoot.setVisibility(View.GONE);
+                                }
+                            }
+                        });
+                        bkgAlpha.start();
+                        
+                        new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
+                            @Override
+                            public void run() {
+                                dismiss(getWaitDialogView());
+                            }
+                        }, exitAnimDurationTemp);
+                    }
+                });
+            }
         }
         
         public void showTip(final TYPE tip) {

+ 6 - 7
DialogX/src/main/java/com/kongzue/dialogx/interfaces/BaseDialog.java

@@ -1,13 +1,11 @@
 package com.kongzue.dialogx.interfaces;
 
 import android.app.Activity;
-import android.app.Application;
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Color;
-import android.graphics.Typeface;
 import android.os.Build;
 import android.os.Handler;
 import android.os.Looper;
@@ -18,22 +16,18 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowInsets;
-import android.view.WindowManager;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.EditText;
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
-import androidx.annotation.ColorRes;
 import androidx.appcompat.app.AppCompatActivity;
-import androidx.appcompat.app.AppCompatDelegate;
 import androidx.fragment.app.FragmentManager;
 
 import com.kongzue.dialogx.DialogX;
 import com.kongzue.dialogx.R;
 import com.kongzue.dialogx.dialogs.PopTip;
-import com.kongzue.dialogx.dialogs.WaitDialog;
 import com.kongzue.dialogx.impl.ActivityLifecycleImpl;
 import com.kongzue.dialogx.impl.DialogFragmentImpl;
 import com.kongzue.dialogx.util.TextInfo;
@@ -42,7 +36,6 @@ import com.kongzue.dialogx.util.views.DialogXBaseRelativeLayout;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
@@ -457,7 +450,13 @@ public abstract class BaseDialog {
         }
     }
     
+    /**
+     * 此标记用于拦截重复 dismiss 指令导致的关闭动画抖动异常
+     */
+    protected boolean dismissAnimFlag;
+    
     protected void beforeShow() {
+        dismissAnimFlag = false;
         if (getContext() == null) {
             init(null);
             if (getContext() == null) {

+ 1 - 1
gradle.properties

@@ -18,5 +18,5 @@ android.useAndroidX=true
 # Automatically convert third-party libraries to use AndroidX
 android.enableJetifier=true
 
-BUILD_VERSION=0.0.44.beta4
+BUILD_VERSION=0.0.44.beta5
 BUILD_VERSION_INT=43