從底部彈出框
阿新 • • 發佈:2019-01-31
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();
}
|