美文网首页
自定义带背景色的Dialog

自定义带背景色的Dialog

作者: 爱吃鱼的外星人 | 来源:发表于2018-04-03 16:22 被阅读383次

说在前面

在项目中经常会用到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()方法即可。

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

相关文章

  • 自定义带背景色的Dialog

    说在前面 在项目中经常会用到dialog,我们项目中也用到了dialog,设计师特地标识了背景为#CC272B3C...

  • Dialog

    安卓dialog的使用+如何自定义dialog自定义Dialog自定义Dialog 自定义

  • Android带进场退场动画的dialog对话框

    需求:弹出一个带自定义动画的dialog对话框 核心代码: R.layout.dialog_layout文件: R...

  • 自定义Dialog

    自定义Dialog的主题 自定义Dialog的布局文件 继承Dialog 并在onCreate方法中将布局设置给D...

  • 【Android】自定义全屏dialog

    一、在themes.xml中添加自定义dialog的样式 二、创建dialog基类 三、创建自定义dialog的布...

  • Android自定义Dialog及其点击事件

    在项目开发中,经常要用到dialog。但是系统的dialog太丑,所有我们要自定义dialog。下面的先介绍自定义...

  • 实现图片Dialog中带ViewPager

    效果图 实现思路 自定义Dialog,为Dialog添加自定义布局,自定义PagerAdapter以及PageTr...

  • 一个漂亮的自定义Dialog

    这是一个自定义的dialog项目 自定义的dialog,具有如下特点 圆角的dialog View 圆形图片的ti...

  • Android圆角对话框Dialog

    需求:模仿iOS样式Dialog对话框。 自定义Dialog 核心代码: Dialog样式: Dialog布局文件...

  • Dialog

    dialog效果的实现由两种,一种是activity采用dialog风格,另一种是自定义的dialog,其中自定义...

网友评论

      本文标题:自定义带背景色的Dialog

      本文链接:https://www.haomeiwen.com/subject/ulfchftx.html