1. 程式人生 > >從底部彈出框

從底部彈出框

private void show1() { Dialog bottomDialog = new Dialog(this, R.style.BottomDialog); View contentView = LayoutInflater.from(this).inflate(R.layout.dialog_content_normal, null); bottomDialog.setContentView(contentView); ViewGroup.LayoutParams layoutParams = contentView.getLayoutParams(); layoutParams.width = getResources().getDisplayMetrics().widthPixels;
contentView.setLayoutParams(layoutParams); bottomDialog.getWindow().setGravity(Gravity.BOTTOM); bottomDialog.getWindow().setWindowAnimations(R.style.BottomDialog_Animation); bottomDialog.show(); }

對話方塊的樣式style:

?
1 2 3 4 <style name="BottomDialog" parent="@style/Base.V7.Theme.AppCompat.Light.Dialog"
> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@android:color/transparent</item> </style>

在對話方塊中的按鈕需要MD風格的波紋效果的話,對話方塊的style的parent需要設定parent="@style/Base.V7.Theme.AppCompat.Light.Dialog",否則沒有效果。同時將對話方塊所在window的標題去掉。android:windowBackground屬性一定要設定成透明,否則自定義形狀的對話方塊背景就是預設的白色了。如果不設定為透明,比如我們通常要設定的圓角對話方塊就沒有效果。

對話方塊顯示時從底部進入,關閉時從底部滑出。動畫樣式:

?
1 2 3 4 <style name="BottomDialog.Animation" parent="Animation.AppCompat.Dialog"> <item name="android:windowEnterAnimation">@anim/translate_dialog_in</item> <item name="android:windowExitAnimation">@anim/translate_dialog_out</item> </style>

tranlate_dialog_in.xml:

?
1 2 3 4 5 6 7 8 <?xml version="1.0" encoding="utf-8"?> android:duration="300" android:fromXDelta="0" android:fromYDelta="100%" android:toXDelta="0" android:toYDelta="0"> </translate>

tranlate_dialog_out.xml:

?
1 2 3 4 5 6 7 8 <?xml version="1.0" encoding="utf-8"?> android:duration="300" android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="0" android:toYDelta="100%"> </translate>

實現底部對話方塊的原理就是修改對話方塊的內容佈局contentView的引數,使它的寬度剛好等於螢幕的寬度,並且設定對話方塊所在Window的gravity屬性為bottom。

需要注意的是,上面程式碼中需要在呼叫contentView.getLayoutParams()需要在setContentView方法後,否則獲取到的LayoutParams為null,當然也可以自己new一個LayoutParams設定給contentView。


如果是要實現底部圓角對話方塊,原理也相似,只需要給contentView新增一個圓角的背景shape,並減小contentView的寬度給左右兩邊留一定的距離,同時給底部設定邊距。

?
1 2 3 4 5 6 7 8 9 10 11 12 private void show2() { Dialog bottomDialog = new Dialog(this, R.style.BottomDialog); View contentView = LayoutInflater.from(this).inflate(R.layout.dialog_content_circle, null); bottomDialog.setContentView(contentView); ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) contentView.getLayoutParams(); params.width = getResources().getDisplayMetrics().widthPixels - DensityUtil.dp2px(this, 16f); params.bottomMargin = DensityUtil.dp2px(this, 8f); contentView.setLayoutParams(params); bottomDialog.getWindow().setGravity(Gravity.BOTTOM); bottomDialog.getWindow().setWindowAnimations(R.style.BottomDialog_Animation); bottomDialog.show(); }