Quellcode durchsuchen

Merge pull request #428 from HChenX/master

允许 BottomDialog , BottomMenu 和 MessageDialog 等使用 setHapticFeedbackEnabled 设置震动。
Kongzue vor 1 Jahr
Ursprung
Commit
c5fa96a672

+ 11 - 3
DialogX/src/main/java/com/kongzue/dialogx/dialogs/BottomDialog.java

@@ -384,6 +384,7 @@ public class BottomDialog extends BaseDialog implements DialogXBaseBottomDialog
                 btnSelectNegative.setOnClickListener(new View.OnClickListener() {
                     @Override
                     public void onClick(View v) {
+                        haptic(v);
                         buttonSelectResult = BUTTON_SELECT_RESULT.BUTTON_CANCEL;
                         if (cancelButtonClickListener != null) {
                             if (cancelButtonClickListener instanceof OnDialogButtonClickListener) {
@@ -405,6 +406,7 @@ public class BottomDialog extends BaseDialog implements DialogXBaseBottomDialog
                 btnSelectOther.setOnClickListener(new View.OnClickListener() {
                     @Override
                     public void onClick(View v) {
+                        haptic(v);
                         buttonSelectResult = BUTTON_SELECT_RESULT.BUTTON_OTHER;
                         if (otherButtonClickListener != null) {
                             if (otherButtonClickListener instanceof OnDialogButtonClickListener) {
@@ -426,6 +428,7 @@ public class BottomDialog extends BaseDialog implements DialogXBaseBottomDialog
                 btnSelectPositive.setOnClickListener(new View.OnClickListener() {
                     @Override
                     public void onClick(View v) {
+                        haptic(v);
                         buttonSelectResult = BUTTON_SELECT_RESULT.BUTTON_OK;
                         if (okButtonClickListener != null) {
                             if (okButtonClickListener instanceof OnDialogButtonClickListener) {
@@ -713,14 +716,14 @@ public class BottomDialog extends BaseDialog implements DialogXBaseBottomDialog
                             boxBkg.setPadding(0, 0, 0, (int) customDialogTop);
                         }
 
-                        //上移动画
+                        // 上移动画
                         ObjectAnimator enterAnim = ObjectAnimator.ofFloat(boxBkg, "y", getRootFrameLayout().getMeasuredHeight(), bkgEnterAimY = boxRoot.getUnsafePlace().top + customDialogTop);
                         enterAnim.setDuration(enterAnimDurationTemp);
                         enterAnim.setAutoCancel(true);
                         enterAnim.setInterpolator(new DecelerateInterpolator(2f));
                         enterAnim.start();
 
-                        //遮罩层动画
+                        // 遮罩层动画
                         ValueAnimator bkgAlpha = ValueAnimator.ofFloat(0f, 1f);
                         bkgAlpha.setDuration(enterAnimDurationTemp);
                         bkgAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@@ -1322,7 +1325,7 @@ public class BottomDialog extends BaseDialog implements DialogXBaseBottomDialog
      * }
      * }
      */
-    //用于使用 new 构建实例时,override 的生命周期事件
+    // 用于使用 new 构建实例时,override 的生命周期事件
     protected void onDismiss(BottomDialog dialog) {
 
     }
@@ -1351,6 +1354,11 @@ public class BottomDialog extends BaseDialog implements DialogXBaseBottomDialog
         return this;
     }
 
+    public BottomDialog setHapticFeedbackEnabled(boolean isHapticFeedbackEnabled) {
+        this.isHapticFeedbackEnabled = isHapticFeedbackEnabled ? 1 : 0;
+        return this;
+    }
+
     public BottomDialog onShow(DialogXRunnable<BottomDialog> dialogXRunnable) {
         onShowRunnable = dialogXRunnable;
         if (isShow() && onShowRunnable != null) {

+ 11 - 6
DialogX/src/main/java/com/kongzue/dialogx/dialogs/BottomMenu.java

@@ -1,5 +1,7 @@
 package com.kongzue.dialogx.dialogs;
 
+import static android.view.View.OVER_SCROLL_NEVER;
+
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
@@ -38,8 +40,6 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 
-import static android.view.View.OVER_SCROLL_NEVER;
-
 /**
  * @author: Kongzue
  * @github: https://github.com/kongzue/
@@ -527,6 +527,7 @@ public class BottomMenu extends BottomDialog {
             listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                 @Override
                 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                    haptic(view);
                     long currentTime = System.currentTimeMillis();
                     if (currentTime - lastClickTime > ITEM_CLICK_DELAY) {
                         lastClickTime = currentTime;
@@ -629,7 +630,7 @@ public class BottomMenu extends BottomDialog {
             }
         }
 
-        //部分主题下选中项默认按下效果
+        // 部分主题下选中项默认按下效果
         if (showSelectedBackgroundTips) {
             listView.post(new Runnable() {
                 @Override
@@ -1085,6 +1086,10 @@ public class BottomMenu extends BottomDialog {
         return this;
     }
 
+    public BottomMenu setHapticFeedbackEnabled(boolean isHapticFeedbackEnabled) {
+        this.isHapticFeedbackEnabled = isHapticFeedbackEnabled ? 1 : 0;
+        return this;
+    }
 
     /**
      * 建议使用 {@link com.kongzue.dialogx.dialogs.BottomMenu#setOkButton(OnBottomMenuButtonClickListener<BottomMenu>)}
@@ -1335,17 +1340,17 @@ public class BottomMenu extends BottomDialog {
         return this;
     }
 
-    //返回点击的菜单索引
+    // 返回点击的菜单索引
     public int getSelectionIndex() {
         return selectionIndex;
     }
 
-    //返回多选时,选择的菜单索引集合
+    // 返回多选时,选择的菜单索引集合
     public int[] getSelectionIndexArray() {
         return resultArray;
     }
 
-    //返回多选时,选择的菜单文本集合
+    // 返回多选时,选择的菜单文本集合
     public CharSequence[] getSelectTextArray() {
         return selectTextArray;
     }

+ 19 - 17
DialogX/src/main/java/com/kongzue/dialogx/dialogs/MessageDialog.java

@@ -3,18 +3,13 @@ package com.kongzue.dialogx.dialogs;
 import android.animation.ValueAnimator;
 import android.annotation.SuppressLint;
 import android.app.Activity;
-import android.content.res.ColorStateList;
 import android.graphics.Bitmap;
-import android.graphics.Color;
 import android.graphics.Outline;
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffColorFilter;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.GradientDrawable;
 import android.os.Build;
-import android.os.Handler;
-import android.os.Looper;
 import android.text.InputFilter;
 import android.text.InputType;
 import android.text.method.LinkMovementMethod;
@@ -52,13 +47,12 @@ import com.kongzue.dialogx.interfaces.OnBindView;
 import com.kongzue.dialogx.interfaces.OnDialogButtonClickListener;
 import com.kongzue.dialogx.interfaces.OnInputDialogButtonClickListener;
 import com.kongzue.dialogx.style.MaterialStyle;
-import com.kongzue.dialogx.util.views.DialogXBaseRelativeLayout;
 import com.kongzue.dialogx.util.InputInfo;
-import com.kongzue.dialogx.util.views.MaxRelativeLayout;
 import com.kongzue.dialogx.util.TextInfo;
+import com.kongzue.dialogx.util.views.DialogXBaseRelativeLayout;
+import com.kongzue.dialogx.util.views.MaxRelativeLayout;
 
 import java.lang.reflect.Field;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 
@@ -436,6 +430,7 @@ public class MessageDialog extends BaseDialog {
                     if (txtInput != null) {
                         imeShow(txtInput, false);
                     }
+                    haptic(v);
                     if (okButtonClickListener != null) {
                         if (okButtonClickListener instanceof OnInputDialogButtonClickListener) {
                             String s = txtInput == null ? "" : txtInput.getText().toString();
@@ -459,6 +454,7 @@ public class MessageDialog extends BaseDialog {
                     if (txtInput != null) {
                         imeShow(txtInput, false);
                     }
+                    haptic(v);
                     if (cancelButtonClickListener != null) {
                         if (cancelButtonClickListener instanceof OnInputDialogButtonClickListener) {
                             String s = txtInput == null ? "" : txtInput.getText().toString();
@@ -482,6 +478,7 @@ public class MessageDialog extends BaseDialog {
                     if (txtInput != null) {
                         imeShow(txtInput, false);
                     }
+                    haptic(v);
                     if (otherButtonClickListener != null) {
                         if (otherButtonClickListener instanceof OnInputDialogButtonClickListener) {
                             String s = txtInput == null ? "" : txtInput.getText().toString();
@@ -508,11 +505,11 @@ public class MessageDialog extends BaseDialog {
             }
 
             boxRoot.setAutoUnsafePlacePadding(isEnableImmersiveMode());
-            //修改下划线颜色
+            // 修改下划线颜色
             if (inputInfo != null && inputInfo.getBottomLineColor() != null) {
                 txtInput.getBackground().mutate().setColorFilter(inputInfo.getBottomLineColor(), PorterDuff.Mode.SRC_ATOP);
             }
-            //修改光标颜色
+            // 修改光标颜色
             if (inputInfo != null && inputInfo.getCursorColor() != null) {
                 int cursorColor = inputInfo.getCursorColor();
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
@@ -533,7 +530,7 @@ public class MessageDialog extends BaseDialog {
                         }
                     }
                 } else {
-                    //Thanks for @Jared Rummler https://stackoverflow.com/questions/11554078/set-textcursordrawable-programmatically/57555148#57555148
+                    // Thanks for @Jared Rummler https://stackoverflow.com/questions/11554078/set-textcursordrawable-programmatically/57555148#57555148
                     try {
                         Field fCursorDrawableRes = TextView.class.getDeclaredField("mCursorDrawableRes");
                         fCursorDrawableRes.setAccessible(true);
@@ -600,8 +597,8 @@ public class MessageDialog extends BaseDialog {
                 boxRoot.setBackgroundColor(maskColor);
             }
             if (backgroundRadius > -1) {
-                //GradientDrawable gradientDrawable = (GradientDrawable) bkg.getBackground();
-                //if (gradientDrawable != null) gradientDrawable.setCornerRadius(backgroundRadius);
+                // GradientDrawable gradientDrawable = (GradientDrawable) bkg.getBackground();
+                // if (gradientDrawable != null) gradientDrawable.setCornerRadius(backgroundRadius);
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                     bkg.setOutlineProvider(new ViewOutlineProvider() {
                         @Override
@@ -681,7 +678,7 @@ public class MessageDialog extends BaseDialog {
 
             boxButton.setOrientation(buttonOrientation);
             if (buttonOrientation == LinearLayout.VERTICAL) {
-                //纵向
+                // 纵向
                 if (style.verticalButtonOrder() != null && style.verticalButtonOrder().length != 0) {
                     boxButton.removeAllViews();
                     for (int buttonType : style.verticalButtonOrder()) {
@@ -726,7 +723,7 @@ public class MessageDialog extends BaseDialog {
                     }
                 }
             } else {
-                //横向
+                // 横向
                 if (style.horizontalButtonOrder() != null && style.horizontalButtonOrder().length != 0) {
                     boxButton.removeAllViews();
                     for (int buttonType : style.horizontalButtonOrder()) {
@@ -786,7 +783,7 @@ public class MessageDialog extends BaseDialog {
                 }
             }
 
-            //Events
+            // Events
             if (bkgInterceptTouch) {
                 if (isCancelable()) {
                     boxRoot.setOnClickListener(new View.OnClickListener() {
@@ -1150,6 +1147,11 @@ public class MessageDialog extends BaseDialog {
         return this;
     }
 
+    public MessageDialog setHapticFeedbackEnabled(boolean isHapticFeedbackEnabled) {
+        this.isHapticFeedbackEnabled = isHapticFeedbackEnabled ? 1 : 0;
+        return this;
+    }
+
     public TextInfo getCancelTextInfo() {
         return cancelTextInfo;
     }
@@ -1479,7 +1481,7 @@ public class MessageDialog extends BaseDialog {
      * }
      * }
      */
-    //用于使用 new 构建实例时,override 的生命周期事件
+    // 用于使用 new 构建实例时,override 的生命周期事件
     protected void onDismiss(MessageDialog dialog) {
 
     }

+ 25 - 21
DialogX/src/main/java/com/kongzue/dialogx/dialogs/PopMenu.java

@@ -1,6 +1,5 @@
 package com.kongzue.dialogx.dialogs;
 
-import static android.view.View.GONE;
 import static android.view.View.OVER_SCROLL_NEVER;
 import static android.view.View.VISIBLE;
 
@@ -18,7 +17,6 @@ import android.view.animation.AccelerateInterpolator;
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
 import android.view.animation.DecelerateInterpolator;
-import android.view.animation.Transformation;
 import android.widget.AdapterView;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
@@ -68,30 +66,30 @@ public class PopMenu extends BaseDialog {
 
     protected PopMenu me = this;
     protected boolean bkgInterceptTouch = true;
-    protected OnBindView<PopMenu> onBindView;                               //自定义布局
-    protected DialogLifecycleCallback<PopMenu> dialogLifecycleCallback;     //对话框生命周期
+    protected OnBindView<PopMenu> onBindView;                               // 自定义布局
+    protected DialogLifecycleCallback<PopMenu> dialogLifecycleCallback;     // 对话框生命周期
     protected OnBackgroundMaskClickListener<PopMenu> onBackgroundMaskClickListener;
     protected List<CharSequence> menuList;
     protected List<Integer> iconResIds;
     protected boolean autoTintIconInLightOrDarkMode = true;
     protected DialogImpl dialogImpl;
     protected WeakReference<View> baseViewWeakReference;
-    protected boolean overlayBaseView = true;                               //允许菜单覆盖在 baseView 上
+    protected boolean overlayBaseView = true;                               // 允许菜单覆盖在 baseView 上
     protected OnMenuItemClickListener<PopMenu> onMenuItemClickListener;
-    protected OnIconChangeCallBack<PopMenu> onIconChangeCallBack;           //设置图标
-    protected int width = -1;                                               //指定菜单宽度
-    protected int height = -1;                                              //指定菜单高度
+    protected OnIconChangeCallBack<PopMenu> onIconChangeCallBack;           // 设置图标
+    protected int width = -1;                                               // 指定菜单宽度
+    protected int height = -1;                                              // 指定菜单高度
     protected TextInfo menuTextInfo;
-    protected boolean offScreen = false;                                    //超出屏幕
+    protected boolean offScreen = false;                                    // 超出屏幕
     protected float backgroundRadius = DialogX.defaultPopMenuBackgroundRadius;
     protected DialogXAnimInterface<PopMenu> dialogXAnimImpl;
     protected OnBackPressedListener<PopMenu> onBackPressedListener;
     protected MenuItemLayoutRefreshCallback<PopMenu> menuMenuItemLayoutRefreshCallback;
     protected int pressedIndex = -1;
 
-    protected int alignGravity = -1;                                        //指定菜单相对 baseView 的位置
+    protected int alignGravity = -1;                                        // 指定菜单相对 baseView 的位置
 
-    //记录 baseView 位置
+    // 记录 baseView 位置
     protected DialogXViewLoc baseViewLoc = new DialogXViewLoc();
     private int selectIndex;
 
@@ -311,7 +309,7 @@ public class PopMenu extends BaseDialog {
 
         MaxRelativeLayout boxBody = getDialogImpl().boxBody;
         DialogXBaseRelativeLayout boxRoot = getDialogImpl().boxRoot;
-        //菜单位置计算逻辑
+        // 菜单位置计算逻辑
         int baseViewLeft = (int) baseViewLoc.getX();
         int baseViewTop = (int) baseViewLoc.getY();
         int calX = 0, calY = 0;
@@ -331,7 +329,7 @@ public class PopMenu extends BaseDialog {
                 calY = (Math.max(0, baseViewTop + baseView().getMeasuredHeight() / 2 - boxBody.getHeight() / 2));
             }
             if (overlayBaseView) {
-                //菜单覆盖在 baseView 上时
+                // 菜单覆盖在 baseView 上时
                 if (isAlignGravity(Gravity.TOP)) {
                     calY = (baseViewTop + baseView().getMeasuredHeight() - boxBody.getHeight());
                     if (calX == 0) {
@@ -434,7 +432,7 @@ public class PopMenu extends BaseDialog {
     }
 
     protected PopMenuArrayAdapter menuListAdapter;
-    protected int selectItemYDeviation; //如果找到了选中菜单,这里记录的是其位置的 Y 偏差值
+    protected int selectItemYDeviation; // 如果找到了选中菜单,这里记录的是其位置的 Y 偏差值
     protected boolean isEnterAnimRunning;
 
     public class DialogImpl implements DialogConvertViewInterface {
@@ -457,7 +455,7 @@ public class PopMenu extends BaseDialog {
 
             blurViews = findAllBlurView(convertView);
 
-            //先设置为 -1 表示未初始化位置
+            // 先设置为 -1 表示未初始化位置
             boxBody.setX(-1);
             boxBody.setY(-1);
             init();
@@ -559,6 +557,7 @@ public class PopMenu extends BaseDialog {
                     selectIndex = position;
                     if (!closing) {
                         if (!getOnMenuItemClickListener().onClick(me, menuList.get(position), position)) {
+                            haptic(view);
                             dismiss();
                         }
                     }
@@ -701,7 +700,7 @@ public class PopMenu extends BaseDialog {
                         long enterAnimDurationTemp = getEnterAnimationDuration(null);
 
                         if (baseView() != null) {
-                            //有绑定按钮的情况下
+                            // 有绑定按钮的情况下
                             int targetHeight = getBodyRealHeight();
                             boxBody.getLayoutParams().height = 1;
 
@@ -715,7 +714,7 @@ public class PopMenu extends BaseDialog {
                                         }
                                     }
                                 }
-                                //找到已选中的项目
+                                // 找到已选中的项目
                                 if (selectMenuIndex != -1) {
                                     int[] viewLoc = new int[2];
                                     if (listMenu.getChildAt(selectMenuIndex) != null) {
@@ -729,7 +728,7 @@ public class PopMenu extends BaseDialog {
                             refreshMenuLoc();
                             selectItemYDeviation = (int) (getMenuLoc().getY() - baseViewLoc.getY());
 
-                            //展开动画
+                            // 展开动画
                             ValueAnimator enterAnim = ValueAnimator.ofFloat(0f, 1f);
                             enterAnim.setInterpolator(new DecelerateInterpolator());
                             enterAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@@ -781,7 +780,7 @@ public class PopMenu extends BaseDialog {
                             enterAnim.setDuration(enterAnimDurationTemp);
                             enterAnim.start();
                         } else {
-                            //无绑定按钮的情况下
+                            // 无绑定按钮的情况下
                             RelativeLayout.LayoutParams rLp = (RelativeLayout.LayoutParams) boxBody.getLayoutParams();
                             rLp.addRule(RelativeLayout.CENTER_IN_PARENT);
                             rLp.width = getWidth() == -1 ? RelativeLayout.LayoutParams.MATCH_PARENT : getWidth();
@@ -1185,6 +1184,11 @@ public class PopMenu extends BaseDialog {
         return this;
     }
 
+    public PopMenu setHapticFeedbackEnabled(boolean isHapticFeedbackEnabled) {
+        this.isHapticFeedbackEnabled = isHapticFeedbackEnabled ? 1 : 0;
+        return this;
+    }
+
     public float getRadius() {
         return backgroundRadius;
     }
@@ -1259,7 +1263,7 @@ public class PopMenu extends BaseDialog {
         return pressedIndex;
     }
 
-    //设置已选择的菜单项(菜单背景会有选中状态的显示)
+    // 设置已选择的菜单项(菜单背景会有选中状态的显示)
     public PopMenu setPressedIndex(int pressedIndex) {
         this.pressedIndex = pressedIndex;
         refreshUI();
@@ -1309,7 +1313,7 @@ public class PopMenu extends BaseDialog {
      * }
      * }
      */
-    //用于使用 new 构建实例时,override 的生命周期事件
+    // 用于使用 new 构建实例时,override 的生命周期事件
     protected void onDismiss(PopMenu dialog) {
 
     }

+ 7 - 4
DialogX/src/main/java/com/kongzue/dialogx/dialogs/PopTip.java

@@ -6,8 +6,6 @@ import android.graphics.Outline;
 import android.graphics.Rect;
 import android.graphics.drawable.GradientDrawable;
 import android.os.Build;
-import android.os.Handler;
-import android.os.Looper;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewOutlineProvider;
@@ -35,11 +33,9 @@ import com.kongzue.dialogx.interfaces.DialogXAnimInterface;
 import com.kongzue.dialogx.interfaces.DialogXRunnable;
 import com.kongzue.dialogx.interfaces.DialogXStyle;
 import com.kongzue.dialogx.interfaces.NoTouchInterface;
-import com.kongzue.dialogx.interfaces.OnBackPressedListener;
 import com.kongzue.dialogx.interfaces.OnBindView;
 import com.kongzue.dialogx.interfaces.OnDialogButtonClickListener;
 import com.kongzue.dialogx.interfaces.OnSafeInsetsChangeListener;
-import com.kongzue.dialogx.util.ObjectRunnable;
 import com.kongzue.dialogx.util.TextInfo;
 import com.kongzue.dialogx.util.views.DialogXBaseRelativeLayout;
 
@@ -592,6 +588,7 @@ public class PopTip extends BaseDialog implements NoTouchInterface {
             txtDialogxButton.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
+                    haptic(v);
                     if (onButtonClickListener != null) {
                         if (!onButtonClickListener.onClick(me, v)) {
                             doDismiss(v);
@@ -675,6 +672,7 @@ public class PopTip extends BaseDialog implements NoTouchInterface {
                     @Override
                     public void onClick(View v) {
                         if (!onPopTipClickListener.onClick(me, v)) {
+                            haptic(v);
                             dismiss();
                         }
                     }
@@ -1159,6 +1157,11 @@ public class PopTip extends BaseDialog implements NoTouchInterface {
         return this;
     }
 
+    public PopTip setHapticFeedbackEnabled(boolean isHapticFeedbackEnabled) {
+        this.isHapticFeedbackEnabled = isHapticFeedbackEnabled ? 1 : 0;
+        return this;
+    }
+
     @Override
     protected void shutdown() {
         dismiss();

+ 20 - 16
DialogX/src/main/java/com/kongzue/dialogx/interfaces/BaseDialog.java

@@ -1,9 +1,9 @@
 package com.kongzue.dialogx.interfaces;
 
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+import static com.kongzue.dialogx.DialogX.DEBUGMODE;
 
 import android.app.Activity;
-import android.app.Application;
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.ColorStateList;
@@ -11,11 +11,11 @@ import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Color;
 import android.os.Build;
-import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
 import android.text.TextUtils;
 import android.util.Log;
+import android.view.HapticFeedbackConstants;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -25,9 +25,7 @@ import android.widget.EditText;
 import android.widget.FrameLayout;
 import android.widget.TextView;
 
-import androidx.annotation.IdRes;
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.fragment.app.FragmentManager;
 import androidx.lifecycle.Lifecycle;
@@ -37,7 +35,6 @@ import androidx.lifecycle.LifecycleRegistry;
 
 import com.kongzue.dialogx.DialogX;
 import com.kongzue.dialogx.R;
-import com.kongzue.dialogx.dialogs.BottomDialog;
 import com.kongzue.dialogx.dialogs.WaitDialog;
 import com.kongzue.dialogx.impl.ActivityLifecycleImpl;
 import com.kongzue.dialogx.impl.DialogFragmentImpl;
@@ -55,8 +52,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CopyOnWriteArrayList;
 
-import static com.kongzue.dialogx.DialogX.DEBUGMODE;
-
 /**
  * @author: Kongzue
  * @github: https://github.com/kongzue/
@@ -71,6 +66,7 @@ public abstract class BaseDialog implements LifecycleOwner {
     protected WeakReference<Activity> ownActivity;
     private WeakReference<FrameLayout> rootFrameLayout;
     private static List<BaseDialog> runningDialogList;
+    protected int isHapticFeedbackEnabled = -1;
     private WeakReference<View> dialogView;
     protected WeakReference<DialogFragmentImpl> ownDialogFragmentImpl;
     protected DialogX.IMPL_MODE dialogImplMode = DialogX.implIMPLMode;
@@ -80,13 +76,13 @@ public abstract class BaseDialog implements LifecycleOwner {
     protected Map<String, Object> data;
     protected DialogXRunnable onShowRunnable;
     protected DialogXRunnable onDismissRunnable;
-    protected boolean enableImmersiveMode = true;   //沉浸式适配
+    protected boolean enableImmersiveMode = true;   // 沉浸式适配
 
     public enum BUTTON_SELECT_RESULT {
-        NONE,           //未做出选择
-        BUTTON_OK,      //选择了确定按钮
-        BUTTON_CANCEL,  //选择了取消按钮
-        BUTTON_OTHER    //选择了其他按钮
+        NONE,           // 未做出选择
+        BUTTON_OK,      // 选择了确定按钮
+        BUTTON_CANCEL,  // 选择了取消按钮
+        BUTTON_OTHER    // 选择了其他按钮
     }
 
     public static void init(Context context) {
@@ -448,10 +444,10 @@ public abstract class BaseDialog implements LifecycleOwner {
 
     public static Activity getTopActivity() {
         if (activityWeakReference == null || activityWeakReference.get() == null) {
-            //尝试反射初始化
+            // 尝试反射初始化
             init(null);
             if (activityWeakReference == null || activityWeakReference.get() == null) {
-                //若还为空,无奈,尝试直接反射拿顶层 activity
+                // 若还为空,无奈,尝试直接反射拿顶层 activity
                 Activity topActivity = ActivityLifecycleImpl.getTopActivity();
                 init(topActivity);
                 return topActivity;
@@ -679,7 +675,7 @@ public abstract class BaseDialog implements LifecycleOwner {
         dismissAnimFlag = false;
         setOwnActivity(getTopActivity());
         if (getOwnActivity() == null) {
-            //尝试重新获取 activity
+            // 尝试重新获取 activity
             init(null);
             if (getOwnActivity() == null) {
                 error("DialogX 未初始化(E5)。\n请检查是否在启动对话框前进行初始化操作,使用以下代码进行初始化:\nDialogX.init(context);\n\n另外建议您前往查看 DialogX 的文档进行使用:https://github.com/kongzue/DialogX");
@@ -702,7 +698,7 @@ public abstract class BaseDialog implements LifecycleOwner {
             });
         }
 
-        //Hide IME
+        // Hide IME
         if (!(this instanceof NoTouchInterface)) {
             View view = getOwnActivity().getCurrentFocus();
             if (view != null) {
@@ -1032,6 +1028,14 @@ public abstract class BaseDialog implements LifecycleOwner {
         dialogView = new WeakReference<>(view);
     }
 
+    protected void haptic(View v) {
+        if (v != null)
+            if (DialogX.useHaptic && isHapticFeedbackEnabled == -1)
+                v.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP);
+            else if (isHapticFeedbackEnabled == 1)
+                v.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP);
+    }
+
     protected boolean isHide;
 
     public boolean isHide() {