话不多说先上效果图

相信大家在项目中这种弹窗是很常见的,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按正常的布局写就行,根布局里面再套一个布局来设置弹窗

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();
网友评论