自定义带背景色的Dialog

说在前面

在项目中经常会用到dialog,我们项目中也用到了dialog,设计师特地标识了背景为
#CC272B3C80%透明度的蓝黑背景,长这样,80%的透明背景看不出来,大家感受没有透明度的吧:

设计师标记的颜色.png

一看这颜色,不就改变下背景嘛

<item name="android:windowBackground">@color/cc272b3c</item>
<item name="android:backgroundDimEnabled">true</item><!--背景亮 -->

改完后运行发现颜色并没有改变,瞬间惊呆,原来木有用。
查阅资料发现windowBackground改变的是dialog自身背景的颜色,而backgroundDimEnabled只能调节页面背景暗或者亮。既然这样那我就把dialog调整为全屏大小,再在dialog中加入viewgroup不就可以了嘛,说干咱抄起家活就干起来:

资源文件

  • 首先设置xml的style,需要把dialog背景设置为透明,页面背景设置高亮

    <style name="CustomerDialog" parent="android:Theme.Dialog">
         <item name="android:windowFrame">@null</item><!--边框 -->
         <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上 -->
         <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item><!--输入法影响 -->
         <item name="android:windowBackground">@color/transparent</item><!--背景透明 -->
         <item name="android:windowNoTitle">true</item><!--无标题 -->
         <item name="android:backgroundDimEnabled">false</item><!--背景亮 -->
     </style>
    
  • 需要一个只带空的framelayout布局

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
               android:id="@+id/fLRootView"
               android:layout_width="match_parent"
               android:layout_height="match_parent"
               android:background="@color/color_272B3C_80">
    </FrameLayout>
    

java类

  • 自定义dialog

    public abstract class BaseDialog extends Dialog {
    
      protected View dView;
      /**
       * 编辑资料页面需要点击阴影部分dialog消失
       * 提供外部调用root布局设置点击事件
       */
      private FrameLayout mFlRootView;
    
      public BaseDialog(Context context, int gravity) {
          this(context, R.style.CustomerDialog, gravity);
      }
    
      public View getRootView() {
          return dView;
      }
    
      private int mGravity;
    
      public BaseDialog(Context context, int style, int gravity) {
          super(context, style);
          requestWindowFeature(Window.FEATURE_NO_TITLE);
          super.setContentView(R.layout.dialog_base);
          this.mGravity = gravity;
    
          dView = getView();
          setContentView(dView);
    
          Window dialogWindow = getWindow();
          if (null != dialogWindow) {
              dialogWindow.setLayout(WindowManager.LayoutParams.MATCH_PARENT,
                      WindowManager.LayoutParams.MATCH_PARENT);
              WindowManager.LayoutParams lp = dialogWindow.getAttributes();
              lp.windowAnimations = R.style.no_dialog_exit;
              dialogWindow.setAttributes(lp);
          }
      }
    
      /**
       * 获取页面布局
       *
       * @return 页面布局资源
       */
      public abstract View getView();
    
      /**
       * 供外部调用跟布局使用
       * @return view
       */
      public View getFlRootView() {
          return mFlRootView;
      }
    
      @Override
      public void setContentView(int layoutId) {
          setContentView(View.inflate(getContext(), layoutId, null));
      }
    
      @Override
      public void setContentView(View view) {
          mFlRootView = (FrameLayout) findViewById(R.id.fLRootView);
          if (mFlRootView == null || view == null) {
              return;
          }
          FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
                  ViewGroup.LayoutParams.MATCH_PARENT,
                  ViewGroup.LayoutParams.WRAP_CONTENT);
          if (mGravity != 0) {
              layoutParams.gravity = mGravity;
          }
          mFlRootView.addView(view, layoutParams);
          mFlRootView.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                //todo something
              }
          });
      }
    
      private boolean mCancelable = true;
    
      @Override
      public void setCancelable(boolean flag) {
          super.setCancelable(flag);
          mCancelable = flag;
      }
    }
    

    我们需要自己用的dialog可以通过继承basedialog重写getview()方法传入我们需要的布局

增加动画

  • 这边有个大兄弟说了,这样传入的view,不就没有动画了嘛!
    这位兄台说的是呢,那么我们现在就加入动画

    首先声明下,我这里传的是dialog显示时候向上滑动,消失向下慢慢隐藏,你们可以根据需求传入

    不罗嗦,直接上代码

     private Animation llBottomIn;
     private Animation llBottomOut;
    
     private void initAnimatorIn() {
         if (llBottomIn == null) {
             llBottomIn = AnimationUtils.loadAnimation(getContext(), R.anim.slide_in_bottom);
         }
         dView.startAnimation(llBottomIn);
     }
    
     private void initAnimatorOut() {
         if (llBottomOut == null) {
             llBottomOut = AnimationUtils.loadAnimation(getContext(), R.anim.slide_out_bottom);
         }
         dView.startAnimation(llBottomOut);
     }
    
     /**
      * 显示或隐藏dialog
      * @param show true 显示 false 隐藏
      */
     public void showDialogWithAnim(boolean show) {
         if (show) {
             initAnimatorIn();
             dView.setVisibility(View.VISIBLE);
             mHandler.sendEmptyMessage(SHOW_DIALOG);
         } else {
             initAnimatorOut();
             dView.setVisibility(View.INVISIBLE);
             mHandler.sendEmptyMessageDelayed(DISMISS_DIALOG, show_delayed);
         }
     }
    
     @Override
     public void dismiss() {
         if (mHandler != null) {
             mHandler.removeMessages(SHOW_DIALOG);
             mHandler.removeMessages(DISMISS_DIALOG);
         }
         super.dismiss();
     }
    
     private final static int SHOW_DIALOG = 0xFF;
     public final static int DISMISS_DIALOG = 0xFE;
     private final static int show_delayed = 300;
    
     /**
      * 实例化一个MyHandler对象
      * 自定义static handler是防止内存泄漏
      */
     private DialogHandler mHandler = new DialogHandler(this);
    
     public DialogHandler getHandler() {
         if (mHandler == null) {
             mHandler = new DialogHandler(this);
         }
         return mHandler;
     }
    
     public static class DialogHandler extends Handler {
    
         WeakReference<BaseDialog> dialogWeakReference;
         BaseDialog dialog;
    
         DialogHandler(BaseDialog dialog) {
             dialogWeakReference = new WeakReference<>(dialog);
             this.dialog = dialogWeakReference.get();
         }
    
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
                 case SHOW_DIALOG:
                     dialog.show();
                     break;
    
                 case DISMISS_DIALOG:
                     dialog.dismiss();
                     break;
    
                 default:
                     break;
             }
         }
     }
    

    子类需要显示或隐藏直接调用showDialogWithAnim()方法即可。

    到这就结束了,只是记录下自己用的,方便以后查看,欢迎大家指教~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容