首先,dialog在业务场景中,通常需要用到的属性:
①:弹窗的背景:通常首先设置为透明背景,其次设置背景的样式,例如带有一些圆角的白色为底.
②:弹窗在界面的显示位置,比如:居中,底部,顶部等.
③:弹窗的大小,注意:在xml中设置的大小、背景,在显示弹窗的时候通常是失效的,所以还需要在创建弹窗的时候重新设置.
④:弹窗的动画效果,即弹出和消失的方向及动画.
下面进行详细讲解:
①:设置Dialog的背景及样式,设置diallog的自身背景为透明的主题,并添加上边框为圆角的白色背景
重写onCreateDialog,并在style.xml中新建Dialog_Fullscreen风格
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
if (mDialog == null) {
Logger.i(Logger._TJ, "onCreateDialog");
mDialog = new Dialog(getActivity(), R.style.Dialog_Fullscreen);
Window window = mDialog.getWindow();
Drawable bg = getResources().getDrawable(R.drawable.dialog_bg);
window.setBackgroundDrawable(bg);
}
return mDialog;
}
dialog_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:topRightRadius="@dimen/d18" android:topLeftRadius="@dimen/d18"/>
<solid android:color="#FFFFFFFF"/>
</shape>
styles.xml
<style name="Dialog_Fullscreen">
<item name="android:windowFullscreen">true</item> //设置全屏
<item name="android:windowNoTitle">true</item> //设置无标题栏 部分机型回带有标题栏
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->
</style>
以下params 的设置:
WindowManager.LayoutParams params = window.getAttributes();
②:设置弹窗的显示位置
params.gravity = Gravity.BOTTOM;//设置显示在底部
params.y = 55;//设置底部后,可以自行在修改它的偏移量
③:设置弹窗的大小
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;//这里高度设置为wrap_content,则默认是xml中设置的大小
④:设置进入和消失的动画
params.windowAnimations = R.style.dialogAnim;
styles.xml
<style name="dialogAnim" mce_bogus="1" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/dialog_push_in</item>
<item name="android:windowExitAnimation">@anim/dialog_push_out</item>
</style>
在res文件夹下,新建文件anim,并创建dialog_push_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromYDelta="100%p"
android:toYDelta="0%p"/>
<alpha
android:duration="@android:integer/config_mediumAnimTime"
android:fromAlpha="0.0"
android:toAlpha="1.0"/>
</set>
创建dialog_push_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromYDelta="0%p"
android:toYDelta="100%p"/>
<alpha
android:duration="@android:integer/config_mediumAnimTime"
android:fromAlpha="1.0"
android:toAlpha="0.3"/>
</set>
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
if (mDialog == null) {
Logger.i(Logger._TJ, "onCreateDialog");
mDialog = new Dialog(getActivity(), R.style.Dialog_No_Title);//设置主题
mDialog.setCanceledOnTouchOutside(true);//设置点击外部,dialog消失
Window window = mDialog.getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.gravity = Gravity.BOTTOM;//设置弹出位置
Drawable bg = getResources().getDrawable(R.drawable.screensaver_dialog_bg);//生成drawable背景
window.setBackgroundDrawable(bg);//设置dialog自身的背景
params.dimAmount = 0.4f;//设置外部的透明度,0 -1 全透明 - 全黑,
window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);//设置FLAG_DIM_BEHIND dimAmount才生效
params.width = WindowManager.LayoutParams.MATCH_PARENT; //设置宽度
params.height = WindowManager.LayoutParams.WRAP_CONTENT;//设置高度
params.windowAnimations = R.style.dialogAnim;//设置动画
}
return mDialog;
}