美文网首页安卓Android
复用性极强使用极其方便快捷的Dialog封装类

复用性极强使用极其方便快捷的Dialog封装类

作者: 阿迪scar | 来源:发表于2020-01-08 14:15 被阅读0次

    话不多说先上效果图

    微信图片_20200108134052.png

    相信大家在项目中这种弹窗是很常见的,dialog和popwindow都可以实现,但是popwindow在部分机型很容易出现遮挡住底部导航栏的问题,所以弹窗我基本都用dialog,但是因为每次创建都要写好多东西,步骤很繁琐,所以我就着手简单封装了一下,大家直接按步骤cv调用就可以了。

    1:设置弹窗样式

    在 res - values 下 style 文件里声明

      <!--自定义dialog背景全透明无边框theme -->
     <style name="MyDialog" parent="android:style/Theme.Dialog">
            <!--背景颜色及和透明程度-->
            <item name="android:windowBackground">@android:color/transparent</item>
            <!--是否去除标题 -->
            <item name="android:windowNoTitle">true</item>
            <!--是否去除边框-->
            <item name="android:windowFrame">@null</item>
            <!--是否浮现在activity之上-->
            <item name="android:windowIsFloating">true</item>
            <!--是否模糊-->
            <item name="android:backgroundDimEnabled">true</item>
            <item name="android:backgroundDimAmount">0.6</item>
            <item name="android:windowAnimationStyle">@style/ShareDialog</item>
            <item name="android:windowCloseOnTouchOutside">true</item>
     </style>
    

    2: 设置弹窗进出动画

    同样在 res - values 下 style 文件里声明

     <!--分享面板的弹出动画-->
        <style name="ShareDialog" parent="android:Animation">
            <item name="android:windowEnterAnimation">@anim/pop_enter_anim</item>
            <item name="android:windowExitAnimation">@anim/pop_exit_anim</item>
        </style>
    

    这两个文件就是动画集,随便自定义,大部分是从下到上透明渐变进入,然后从上到下透明渐变退出。在 res 下新建 anim 文件夹,然后创建 animation-file ,内容也贴上
    1: enter

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
         android:duration="250">
        <!--
            位移动画
        -->
        <translate
            android:duration="300"
            android:fromYDelta="100%p"
            android:toYDelta="0" />
        <!--
            透明动画
        -->
        <alpha
            android:duration="300"
            android:fromAlpha="0.0"
            android:toAlpha="1.0" />
    </set>
    

    2:exit

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
         android:duration="250">
        <translate
            android:duration="300"
            android:fromYDelta="0"
            android:toYDelta="50%p" />
        <alpha
            android:duration="300"
            android:fromAlpha="1.0"
            android:toAlpha="0.0" />
    
    </set>
    

    3: 敲黑板了!!这一步就就最关键的,创建BaseDialog类继承Dialog

    import cn.zhongyu.edencity.R;
    
    // Created by 阿迪 on 2020/1/7.
    
    public class BaseDialog extends Dialog {
    
        private final View contentView;
        private final int gravity;
    
        public BaseDialog(@NonNull Context context, View contentView , int gravity) {
            //构造传入自定义视图和位置,style样式
            super(context,R.style.MyDialog);
            this.contentView = contentView;
            this.gravity = gravity;
            initView();
        }
    
        protected void initView() {
            super.setContentView(contentView);
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            getWindow().setGravity(gravity);
            WindowManager windowManager = getWindow().getWindowManager();
            Display display = windowManager.getDefaultDisplay();
            WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
            layoutParams.width = display.getWidth();
            getWindow().setAttributes(layoutParams);
        }
    }
    

    4:xml按正常的布局写就行,根布局里面再套一个布局来设置弹窗

    微信图片_20200108140509.png

    5: 在用户点击事件监听方法里创建Dialog

     //设置自定义视图
       View contentView = getLayoutInflater().inflate(R.layout.dialog_name_check, null);
       ImageView head_img=contentView.findViewById(R.id.head_img);
       ImageView close=contentView.findViewById(R.id.close);
       TextView desc1=contentView.findViewById(R.id.desc1);
       TextView desc2=contentView.findViewById(R.id.desc2);
       TextView go=contentView.findViewById(R.id.go);
    
       //视图中view点击事件
       close.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
               //BaseDialog对象声明成全局,调用方便
                baseDialog.dismiss();
              }
       });
      //创建Dialog,传入上下文,自定义dialog视图,dialog展示位置
       baseDialog = new BaseDialog(getActivity(), contentView, Gravity.CENTER);
       baseDialog.show();
    

    好了,到这里就大功告成了,这样每次需要弹窗就只创建自定义布局就可以解决问题,是不是很方便嘞,如果使用过程中有什么问题的话可以直接私信或者评论哦

    相关文章

      网友评论

        本文标题:复用性极强使用极其方便快捷的Dialog封装类

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