安卓Android

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

2020-01-08  本文已影响0人  阿迪scar

话不多说先上效果图

微信图片_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();

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

上一篇下一篇

猜你喜欢

热点阅读