Skip to content

WaitDialog&TipDialog_tc

Kongzue edited this page May 17, 2024 · 3 revisions

🌐 View English Document | 简体中文文档

⌛等待框 WaitDialog 和提示框 TipDialog

等待框 WaitDialog 和提示框 TipDialog

阻斷式等待提示框,會顯示基礎的環形等待動畫以及進度展示動畫,它是單例的,這就意味著從等待狀態 WaitDialog 切換到提示狀態 TipDialog 是無縫的,你可以自由的選擇在等待結束後顯示成功/警告/錯誤三種狀態的消息提示,動畫的切換也會無縫銜接。

使用前請注意,等待框 WaitDialog 和提示框 TipDialog的背景是與亮/暗色模式相反的,這是為了突出顯示。

顯示一個最簡單的等待框

使用以下代碼顯示一個等待框:

WaitDialog.show("Please Wait!");

WaitDialog 在顯示後會持續運行,直到彈出一個提示框 TipDialog 或者使用.dismiss()方法關閉它。

以下是一個最簡單的例子,程序會在運行 2 秒後自動關閉 WaitDialog:

WaitDialog.show("Please Wait!");
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
    @Override
    public void run() {
        WaitDialog.dismiss();
    }
}, 2000);

若要修改已經顯示的 WaitDialog 的文字,可以直接重新執行 WaitDialog.show("其他文字"); 即可。

顯示一個最簡單的提示框

提示框 TipDialog 分為三種樣式,完成(SUCCESS)、警告(WARNING)和錯誤(ERROR)

提示框 TipDialog

TipDialog 實際上是 WaitDialog 的代理類,WaitDialog 在啟動後至關閉前都只會有一個實例,因此在 WaitDialog 顯示過程中執行 TipDialog 就會中斷等待框的顯示,轉而銜接顯示一個提示框,除此之外,TipDialog 也可以單獨執行顯示。

提示框的銜接是有線條動畫效果的,若 WaitDialog 正在顯示時,在執行 TipDialog 的顯示指令後不一定會立即顯示提示框,可能會等待動畫可以銜接時才會轉而顯示 TipDialog。

使用以下代碼顯示一個完成等待框:

TipDialog.show("Success!", WaitDialog.TYPE.SUCCESS);

另有警告框和錯誤框狀態可選:

//警告
TipDialog.show("Warning!", WaitDialog.TYPE.WARNING);
//錯誤
TipDialog.show("Error!", WaitDialog.TYPE.ERROR);

提示框預設在顯示 1.5 秒後會自動消失,你可以透過以下方法來自訂顯示時間(毫秒):

TipDialog.show("Success!", WaitDialog.TYPE.SUCCESS, 3500);

顯示一個進度提示框

進度提示可以以一個圓環為表現可視化展示當前的流程進度。

因為準確度要求,進度提示開始時不會有過渡動畫。

使用以下代碼顯示一個進度框:

WaitDialog.show("正在載入...", 0.1f);

第二個浮點型的參數即進度,取值範圍為0f ~ 1f,會由上一個進度平滑過渡到下一個設定的進度,也可以反向進行進行減少。

🚧 實現傳統的進度條對話框

image

要顯示一個傳統的對話框進度條(例如下載更新的場景),請參閱 《常見問題:Q:如何實現傳統的進度條對話框?》

生命週期回調

等待框 WaitDialog 和提示框 TipDialog 可以通過設置 .setDialogLifecycleCallback(...) 設置生命週期事件回調:

TipDialog.show("Success!", WaitDialog.TYPE.SUCCESS)
        .setDialogLifecycleCallback(new DialogLifecycleCallback<WaitDialog>() {
    @Override
    public void onShow(WaitDialog dialog) {
        //對話框啟動時回調
    }
    @Override
    public void onDismiss(WaitDialog dialog) {
        //對話框關閉時回調
    }
});

你也可以使用方法 .onShow(DialogXRunnable).onDismiss(DialogXRunnable),來處理生命週期事務,例如:

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

WaitDialog/TipDialog 也支持 Lifecycle,你可以使用 .getLifecycle() 獲取 Lifecycle 對象。

返回按鍵監聽

等待框 WaitDialog 和提示框 TipDialog 可以通過設置 .setDialogLifecycleCallback(...) 設置當用戶按下系統返回鍵時的事件處理:

WaitDialog.show("Please Wait!").setOnBackPressedListener(new OnBackPressedListener() {
    @Override
    public boolean onBackPressed() {
        toast("按下返回");
        return false;
    }
});

從上述代碼可以看到onBackPressed()方法是有一個回調值,當return true時可以自動關閉等待/提示對話框。

自訂布局

WaitDialog 和 TipDialog 也支持自訂布局樣式,使用方式與基本消息對話框相同:

WaitDialog.show("Please Wait!").setCustomView(new OnBindView<WaitDialog>(R.layout.layout_custom_view) {
            @Override
            public void onBind(WaitDialog dialog, View v) {
            
            }
        });

在啟用自訂布局後,WaitDialog 和 TipDialog 自身的動畫布局將會隱藏。

自訂進入和關閉動畫

針對單次顯示的對話框動畫修改,可使用以下方法進行自訂:

WaitDialog.show("請稍後...")
        //設置入場動畫資源和出場動畫資源
        .setAnimResId(R.anim.anim_dialogx_bottom_enter, R.anim.anim_dialogx_bottom_exit);

要自訂動畫文件,可以參考:預設對話框啟動動畫文件預設對話框關閉動畫文件

額外說明,除了 .setAnimResId(enterAnimResId, exitAnimResId) 外,還有 .setEnterAnimResId(enterAnimResId).setExitAnimResId(enterAnimResId) 單獨方法可選,此方法僅針對單次顯示的對話框有效。

另外你也可以通過 setEnterAnimDuration([long]) 設置入場動畫時長以及通過 .setExitAnimDuration([long]) 設置關閉動畫時長。

對 WaitDialog、TipDialog 全局生效的的動畫修改:

你可以通過靜態屬性直接修改全局 WaitDialog 的動畫:

//設置全局 PopTip入場動畫
WaitDialog.overrideEnterAnimRes = R.anim.anim_dialogx_bottom_enter;
//設置全局 PopTip出場動畫
WaitDialog.overrideExitAnimRes = R.anim.anim_dialogx_bottom_exit;
//設置全局 PopTip入場動畫時間
WaitDialog.overrideEnterDuration = 1000;
//設置全局 PopTip出場動畫時間
WaitDialog.overrideExitDuration = 1000;

通過自訂主題修改

您還可以通過參考自訂主題介面,完全訂製全局的動畫框默認動畫效果,具體請查閱 《自訂 DialogX 主題》

請注意這三種設置是由優先度區別的,針對單次顯示的對話框動畫修改優先度 > 對 WaitDialog、TipDialog 全局生效的的動畫修改 > 自訂主題修改。

其他額外方法

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

//關閉對話框
.dismiss();

//獲取對話框實例化對象,您可以透過此方法更深度的訂製Dialog的功能
.getDialogImpl()

//獲取自訂布局實例
.getCustomView()
    
//設置背景顏色,強行對對話框背景進行染色,請注意參數為int類型的顏色值而非R.color的索引
.setBackgroundColor(ColorInt);

//設置對話框圓角(會裁切內容顯示)
.setRadius(float px)

//是否處於顯示狀態
.isShow()

//置頂對話框
.bringToFront()

//指定對話框顯示層級
.setThisOrderIndex(int)

TipDialog 在展示提示時會有振動回饋,受以下屬性控制影響:

//使用振動回饋
DialogX.useHaptic = true;

背景遮罩

WaitDialog 支持修改背景遮罩,這是為了豐富擴展性。如果需要背景遮罩,您可以自行使用如下代碼設置:

WaitDialog.show(...).setMaskColor(colorInt);

請注意,傳入參數為 ColorInt 值,您可以使用 Color.parseColor("#4D000000") 設置一個 HEX 色值,或使用 getResources().getColor(R.color.black30) 設置一個顏色的資源值。

動畫銜接

默認情況下,使用 Material 動畫的主題時,從 等待狀態提示狀態(完成、警告、錯誤) 是需要等待一段時間以完成動畫的銜接,最大時長取決於當前等待動畫轉到的進度,如果需要去掉動畫銜接效果,以達到快速響應,您可以使用 NoArticulatedProgressView 來實現對默認等待提示動畫的替換:

在您設置 DialogX 的主題時,請重寫 overrideWaitTipRes 相關設置:

DialogX.globalStyle = new MaterialStyle(){
    @Override
    public WaitTipRes overrideWaitTipRes() {
        return new WaitTipRes() {
            @Override
            public ProgressViewInterface overrideWaitView(Context context, boolean light) {
                return new NoArticulatedProgressView(context);  //重要!
            }
        };
    }
};

NoArticulatedProgressView 是自帶組件,只需要引入 import com.kongzue.dialogx.util.views.NoArticulatedProgressView; 即可

Clone this wiki locally