https://github.com/XXQAQ/FasterDialog
前言:FasterDialog是一個完全解耦彈窗邏輯與布局樣式的三方框架,即便你的眾多項目有不同的布局樣式需求,只要引入FasterDialog就可以讓你的所有項目都用同一份代碼描述業務邏輯。
在你的項目設計中,你的UI設計師曾可能提過如下需求:
針對以上的各式各樣的需求,以前我們會在每個項目編寫滿足對應項目需要的Dialog。實際上,在自定義Dialog的過程中,我們發現除了布局或者控件位置樣式等屬性不同之外,剩余百分之90的邏輯代碼都是相似或相同的。
那么,有沒有那么一種辦法,可以讓我們無需書寫這百分之90的重復性代碼,通過某種協議協定一些規則,使我們的代碼兼容所有的UI場景,而在使用的過程,只需要通過一個簡單方法就可以將Dialog樣式切換到指定布局方案。如下所示
//使用上圖1的布局方案
new NormalDialog(getContext()).setCustomView(R.layout.layout_1).setTitle("刪除").setContent("確定要刪除所選的一個會話嗎?").setPositiveText("刪除").setNegativeText("取消").show();
//使用上圖2的布局方案
new NormalDialog(getContext()).setCustomView(R.layout.layout_2).setTitle("賬號在其他設備登陸").setContent("您的支付寶賬號于...(內容過長遂省略)").setPositiveText("好的").setNegativeText("重置密碼").show();
//使用上圖3的布局方案
new NormalDialog(getContext()).setCustomView(R.layout.layout_3).setTitle("確定注銷").setContent("確定注銷當前賬號?").setPositiveText("確定").setNegativeText("取消").show();
是的,FasterDialog的設計理念就是如此!每當我們有新的UI需求,保持代碼層無需改動,自行編寫項目所需要的布局文件,通過設定不同的layout就可以將Dialog切換至不同的布局方案。這樣具備極高的解耦性,也大大降低了代碼維護成本。So,為了使程序員不再重復寫百分之90的代碼而專精于業務需求,設計了FasterDialog。
除此之外,FasterDialog還具備以下特性:
1.動態變化;即使在Dialog show出來以后,依然可以通過setTitle setXXX這樣的方法動態改變Dialog中顯示的內容
2.無需權限,無Activity環境彈窗
3.封裝了一些Dialog常用但實現略微繁瑣的方法;一個方法就可以讓你的Dialog實現如 底部彈窗(是的,官方的BottomDialog被FasterDialog一個方法即可取代),頂部彈窗,寬高屏占比,最大寬高值,自動消失等功能
4.其他:鏈式調用、擴展預留
Dialog分類
在介紹分類之前,我們先翻閱官方AlertDialog的源碼。給我的第一感受是功能冗雜,API繁多。明明有很多方法只能在特定場景下使用,放在子類更合適,但AlertDialog偏偏全都強行加了進去。首先從設計上來說不利于后續擴展,而且由于身兼多職也導致無法專精于某一個模塊。
所以考慮到此,FasterDialog細分了各個模塊的作用域,針對App上常見的Dialog類型進行了如下分類:
如上圖所示,不同的Dialog專精于不同的模塊,不會出現功能混雜的情況。當然,如果我制定的Dialog不滿足你的項目需求,你也可以直接繼承對應的Dialog,不需要大刀闊斧地修改,幾分鐘之內就可在項目中使用。
PS:再次強調,以上所有效果圖僅為FasterDialog自帶默認布局方案,除此之外FasterDialog還包含Meterail布局方案,你也可以自行編寫xml布局,Dialog最終效果由你自己決定。
API
所有Dialog通用方法
BaseDialog dialog;? ? ? ? //所有Dialog均繼承于BaseDialog,因此所有子類均可調用以下方法。
dialog.setCustomView()//設置彈窗的layoutID,默認已有
? ? ? .setWidth()//設置彈窗寬度(單位px)
? ? ? .setWidthWrap()//設置彈窗寬為內容包裹
? ? ? .setWidthMatch()//設置彈窗寬為填充屏幕
? ? ? .setWidthPercent()//設置彈窗寬度占屏幕寬度的百分比(取值范圍0-1.0)
.setMaxWidth()//設置彈窗最大寬度(單位px)
? ? ? .setHeight()//設置彈窗高度(單位px)
.setHeightWrap()//設置彈窗高為內容包裹
? ? ? .setHeightMatch()//設置彈窗高為填充屏幕
.setHeightPercent()//設置彈窗寬度占屏幕高度的百分比(取值范圍0-1.0)
? ? ? .setMaxHeight()//設置彈窗最大高度(單位px)
? ? ? .setX()//設置彈窗的橫坐標
.setY()//設置彈窗的縱坐標
? ? ? .setPopupFromBottom()//設置彈窗從底部彈窗,并且沉在底部(仿MIUI)
? ? ? .setPopupFromTop()//設置彈窗從頂部彈窗,并且浮在頂部
? ? ? .setCancel()//設置彈窗是否可被取消
.setCancelOutside()//設置彈窗是否可點擊外部空間后消失
? ? ? .setAutoDismissTime()//設置彈窗自動消失時間
? ? ? .setAnimatStyle()//設置彈窗的出現消失動畫
? ? ? .setTag()//設置TAG
? ? ? .addOnCancelListener()//添加彈窗取消監聽
.addOnDismissListener()//添加彈窗消失監聽
? ? ? .addOnShowListener()//添加彈窗顯示監聽
? ? ? .show();? ? //顯示
dialog.dismiss();//隱藏
LoadingDialog
LoadingDialog dialog = new LoadingDialog(this);
dialog.setLodingText("加載中...")//設置加載文字
? ? ? ? ? .show();
NormalDialog
NormalDialog dialog = new NormalDialog(this);
dialog
//? ? ? ? ? ? .setCustomView(NormalDialog.LAYOUT_XQ)? ? ? //默認布局方案
//? ? ? ? ? ? .setCustomView(NormalDialog.LAYOUT_METERAIL)//Meterail布局方案
//? ? ? ? ? ? .setCustomView(R.layout.yourlayout)? ? //設置你自己的布局方案
? ? ? ? ? ? .setIcon(0)? ? ? ? //設置圖標,支持GIF圖片
? ? ? ? ? ? .setTitle("標題")? //設置標題
? ? ? ? ? ? .setContent("內容") //設置內容
? ? ? ? ? ? .setPositiveText(NormalDialog.SURE) //設置確認文字
? ? ? ? ? ? .setPositiveListener(null)? //設置確認監聽
? ? ? ? ? ? .setNegativeText(NormalDialog.CANCLE)//設置取消文字
? ? ? ? ? ? .setNegativeListener(null)? //設置取消監聽
? ? ? ? ? ? .setNeutralText("其他")? ? //設置中立文字
? ? ? ? ? ? .setNeutralListener(null)? //設置中立監聽
//? ? ? ? ? ? .setData()//一個方法即可設置以上所有內容
? ? ? ? ? ? .show();
ImageDialog
ImageDialog dialog = new ImageDialog(this);//ImageDialog繼承于NormalDialog,可以使用NormalDialog的所有方法
dialog
//? ? ? ? ? ? .setCustomView(ImageDialog.LAYOUT_XQ)? ? ? //默認布局方案
//? ? ? ? ? ? .setCustomView(R.layout.yourlayout)? ? //設置你自己的布局方案
? ? ? ? ? ? .setIcon(0) //設置圖標,支持GIF圖片
? ? ? ? ? ? .setTitle("標題") //設置標題
? ? ? ? ? ? .setContent("內容") //設置內容
? ? ? ? ? ? .setPositiveText(NormalDialog.SURE) //設置確認文字
? ? ? ? ? ? .setPositiveListener(null) //設置確認監聽
? ? ? ? ? ? .setNegativeText(NormalDialog.CANCLE)//設置取消文字
? ? ? ? ? ? .setNegativeListener(null) //設置取消監聽
? ? ? ? ? ? .setNeutralText("其他") //設置中立文字
? ? ? ? ? ? .setNeutralListener(null) //設置中立監聽
//? ? ? ? ? .setImageRes()? //設置大圖的資源ID,與下方法不要同時使用
? ? ? ? ? ? .setImageUrl("http://t2.hddhhn.com/uploads/tu/201610/198/hkgip2b102z.jpg")? //設置大圖的路徑地址,支持本地圖片的同時也支持網絡圖片,與上方法不要同時使用
//? ? ? ? ? .setData()//一個方法即可設置以上所有內容
//? ? ? ? ? .setDialogImageLoder()? //建議使用Glide或者其他圖片加載器加載圖片,默認加載器不提供三級緩存
? ? ? ? ? ? .show();
ProgressDialog
? ? ? ? ProgressDialog dialog = new ProgressDialog(this); //ProgressDialog與NormalDialog均繼承于SimpleDialog,因此均可設置title,icon,content等屬性
dialog
//? ? ? ? ? ? .setCustomView(ProgressDialog.LAYOUT_XQ)? ? ? //默認布局方案
//? ? ? ? ? ? .setCustomView(ProgressDialog.LAYOUT_METERAIL)? ? ? //Meterail布局方案
//? ? ? ? ? ? .setCustomView(R.layout.yourlayout)? ? //設置你自己的布局方案
? ? ? ? ? ? .setIcon(0)? ? ? ? //設置圖標,支持GIF圖片
? ? ? ? ? ? .setTitle("標題")? //設置標題
? ? ? ? ? ? .setContent("內容") //設置內容? ? ? ? ? ? ?
? ? ? ? ? ? .setProgress(50)? ? ? //設置進度值(范圍0-100)
//? ? ? ? ? ? ? ? .setProgress(50,"正在刪除 /System 文件夾中")//設置進度值+進度描述字符串
? ? ? ? ? ? .show();
待完善ListDialog與EditDialog