1. 程式人生 > >Android底部彈窗實現

Android底部彈窗實現

Android底部彈窗

再一次需求中,使用到了底部彈窗,這裡就給大家總結一下,我用到的主要有兩種

  • 基於Dialog實現
  • 基於PopupWindow實現

Dialog方式

老規矩,直接上程式碼:

    Dialog dialog = new Dialog(getContext(), R.style.BottomDialogTheme);
    //獲得dialog的window視窗
    Window window = dialog.getWindow();
    //設定dialog在螢幕底部
    window.setGravity(Gravity.BOTTOM);
    //設定dialog彈出時的動畫效果,從螢幕底部向上彈出
    window.setWindowAnimations(R.style.PopupAnimation);
    window.getDecorView().setPadding(0, 0, 0, 0);
    //獲得window視窗的屬性
    android.view.WindowManager.LayoutParams lp = window.getAttributes();
    //設定視窗寬度為充滿全屏
    lp.width = WindowManager.LayoutParams.MATCH_PARENT;
    //設定視窗高度為包裹內容
    lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
    //將設定好的屬性set回去
    window.setAttributes(lp);
    //將自定義佈局載入到dialog上
    dialog.setContentView(itemView);
    dialog.show();

相關資源

Dialog的相關主題風格

<style name="BottomDialogTheme" parent="android:Theme.Dialog">
    <item name="android:windowFrame">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>

</style>

Dialog彈出風格

 <style name="PopupAnimation" parent="android:Animation">
    <item name="android:windowEnterAnimation">@anim/up_in</item>
    <item name="android:windowExitAnimation">@anim/down_out</item>
</style>

相關動畫
up_in

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
 <translate
    android:fromYDelta="80%p"
    android:toYDelta="0"
    android:duration="100"
    />
</set>

down_out

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:fromYDelta="0"
    android:toYDelta="80%p"
    android:duration="400"
    />
</set>

使用

直接使用下面程式碼

View itemView = View.inflate(getContext(), R.layout.poup_mark_msg, null);

講poup_mark_msg.xml替換成自己的需要的佈局即可。

PopupWindow方式

與Dialog方式使用類似,程式碼如下:

View view = this.getLayoutInflater()
.inflate(R.layout.poup_mark_msg, null);
    popupWindow = new PopupWindow(view, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
    popupWindow.setFocusable(true);
    popupWindow.setOutsideTouchable(true);
    popupWindow.setBackgroundDrawable(new ColorDrawable(0));
    popupWindow.setAnimationStyle(R.style.PopupAnimation);
    popupWindow.showAtLocation(main, Gravity.BOTTOM, 0, 0);
    //透明度變暗
    backgroundAlpha(0.7f);
    //新增popupwindow消失監聽
    popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
        @Override
        public void onDismiss() {
            //還原透明度
            backgroundAlpha(1.0f);
        }
    });

一般我們都會為了突出彈窗,講其他部分新增一層陰影,這裡實現起來也很簡單直接監聽popupWindow的現實和消失修改透明度即可 。
關鍵方法如下:

/**
 * 設定新增螢幕的背景透明度
 *
 * @param bgAlpha
 */
    public void backgroundAlpha(float bgAlpha) {
    WindowManager.LayoutParams lp = getWindow().getAttributes();
    lp.alpha = bgAlpha; //0.0-1.0
    getWindow().setAttributes(lp);
}

使用

同Dialog的使用方式

這就把兩種方式介紹完了,哪種方式好 ,使用一波就知道了,哈哈