Skip to content

FullScreenDialog_tc

Kongzue edited this page Sep 14, 2024 · 5 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 時下滑無法關閉。

使用 ViewBinding 的話也可以更換為 OnBindingView 來實現直接通過 binding 獲取佈局實例:

FullScreenDialog.show(new OnBindingView<FullScreenDialog, LayoutCustomViewBinding>() {
            @Override
            public void onBind(FullScreenDialog dialog, View view, LayoutCustomViewBinding binding) {
                //View childView = binding.childView
            }
        });

生命週期回調

想要監控對話框的生命週期,可以實現其 .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