Skip to content

全屏对话框 FullScreenDialog

Kongzue edited this page May 17, 2024 · 20 revisions

🌐 View English Document | 繁體中文文檔

📋全屏对话框 FullScreenDialog

全屏对话框 FullScreenDialog

全屏对话框 FullScreenDialog 提供从底部弹出的对话框效果,类似 BottomDialog 但相比 BottomDialog 的定制化自由度更高。全屏对话框 FullScreenDialog 将不提供任何基础实现,开发者可以自定义实现布局。默认只提供一个默认的下划关闭逻辑和 Activity 背景下沉的显示效果。

显示一个全屏对话框

先准备好一个布局文件,然后使用以下代码显示一个全屏对话框:

FullScreenDialog.show(new OnBindView<FullScreenDialog>(R.layout.layout_full_screen) {
    @Override
    public void onBind(FullScreenDialog dialog, View v) {
        //View childView = v.findViewById(resId)...
    }
});

请注意,DialogX 的全屏对话框不自带标题、正文内容和按钮布局,如果需要请在自己的布局中进行实现。

全屏对话框默认支持下滑关闭手势,当对话框的 cancelable 被设置为 false 时下滑无法关闭。

生命周期回调

想要监控对话框的生命周期,可以实现其 .setDialogLifecycleCallback(...) 接口,建议使用build()方法构建对话框:

FullScreenDialog.build()
        .setDialogLifecycleCallback(new DialogLifecycleCallback<FullScreenDialog>() {
            @Override
            public void onShow(FullScreenDialog dialog) {
                //对话框启动时回调
            }
            @Override
            public void onDismiss(FullScreenDialog dialog) {
                //对话框关闭时回调
            }
        })
        .show();

FullScreenDialog 也支持 Lifecycle,你可以使用 .getLifecycle() 获取 Lifecycle 对象。

你也可以通过使用 new 构建实例时,override 的生命周期事件的方式来处理生命周期事务,例如:

//复写事件演示
new FullScreenDialog() {
    @Override
    public void onShow(FullScreenDialog dialog) {
        //...
        tip("onShow");
    }
    @Override
    public void onDismiss(FullScreenDialog dialog) {
        //...
        tip("onDismiss");
    }
}

你也可以使用方法 .onShow(DialogXRunnable).onDismiss(DialogXRunnable),来处理生命周期事务,例如:

FullScreenDialog.show(...)
        .onShow(new DialogXRunnable<FullScreenDialog>() {
            @Override
            public void run(FullScreenDialog dialog) {
                //FullScreenDialog show!
            }
        })
        .onDismiss(new DialogXRunnable<FullScreenDialog>() {
            @Override
            public void run(FullScreenDialog dialog) {
                //FullScreenDialog dismiss!
            }
        });

其他额外方法

//强制重新刷新界面
.refreshUI();

//关闭对话框
.dismiss();

//是否允许点击外部区域或返回键关闭
.setCancelable(boolean);
    
//设置返回按键回调
.setOnBackPressedListener(OnBackPressedListener);

//获取对话框实例化对象,您可以通过此方法更深度的定制Dialog的功能
.getDialogImpl()

//获取自定义布局实例
.getCustomView()
    
//设置背景颜色,强行对对话框背景进行染色,请注意参数为int类型的颜色值而非R.color的索引
.setBackgroundColor(ColorInt);

//设置对话框圆角(会裁切内容显示,此设置在 FullScreenDialog 中只影响左上、右上两个角的圆角)
.setRadius(float px)

//隐藏对话框(无动画),恢复显示请执行非静态方法的 .show()
.hide();

//隐藏对话框(模拟关闭对话框的动画),恢复显示请执行非静态方法的 .show()
.hideWithExitAnim();

//是否允许滑动关闭(仅对 Material 主题有效)
.setAllowInterceptTouch(boolean)

//是否处于显示状态
.isShow()

//置顶对话框
.bringToFront()

//指定对话框显示层级
.setThisOrderIndex(int)

背景遮罩

FullScreenDialog 支持修改背景遮罩,这是为了丰富扩展性。如果需要背景遮罩,您可以自行使用如下代码设置:

fullScreenDialog.setMaskColor(colorInt);

请注意,传入参数为 ColorInt 值,您可以使用 Color.parseColor("#4D000000") 设置一个 HEX 色值,或使用 getResources().getColor(R.color.black30) 设置一个颜色的资源值。

背景圆角

全屏对话框的背景缩放将默认从设备圆角(若无法获取则依照当前默认值0,即直角)向内缩小的同时,圆角渐变为 activityContentRadius 值,activityContentRadius 默认取对话框圆角值 radius,若对话框圆角未设置默认 15dp。

你可以指定一个值,用于指定全屏对话框背景向内缩放到的目标圆角值;

.setActivityContentRadius(float) 

在非支持设备上指定一个设备圆角大小值:

.setDeviceRadius(int)

activityContentRadius 还可指定标准设置:FullScreenDialog.ACTIVITY_CONTENT_RADIUS_KEEP 此设置将使背景圆角不进行变化,保持按照设备圆角值进行缩小。

减少卡顿(实验性)

FullScreenDialog 对话框实现背景下沉的原理是对当前显示的界面进行截图并对截图进行缩放,此时界面理论上可以不再进行渲染,您可以通过以下代码启用在 FullScreenDialog 启动时隐藏并阻止当前 Activity 界面进行重测量和渲染,这样有助于在 FullScreenDialog 使用复杂布局时减少卡顿现象:

ActivityScreenShotImageView.hideContentView = true;

在关闭对话框时界面将恢复显示和渲染。

Clone this wiki locally