【Code-Snippet】Dialog

1. 基本寫法

public class VoiceInteractionDialog {
    private CustomDialog customDialog;
    public VoiceInteractionDialog(Context context) {
        customDialog = new CustomDialog(context);
    }
    public void show() {
        if (customDialog.getWindow()!=null) {
            customDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            customDialog.show();
        }
    }
    public boolean isShowing() {
        return customDialog.isShowing();
    }
    public void dismiss() {
        customDialog.dismiss();
    }
    private class CustomDialog extends Dialog {
        CustomDialog(@NonNull Context context) {
            super(context, R.style.VoiceInteractionDialog_theme);
            setContentView(R.layout.activity_voice_interaction);
            setCancelable(true);
            setCanceledOnTouchOutside(false);
            if (getWindow()!=null) {
                getWindow().setGravity(Gravity.CENTER);
                getWindow().setWindowAnimations(R.style.VoiceInteractionDialog_animation);
                getWindow().setLayout(context.getResources().getDisplayMetrics()
                    .widthPixels, WindowManager.LayoutParams.MATCH_PARENT);
                getWindow().setDimAmount(0.7f);
            }
        }
    }
}
複製代碼

2. 部分屬性說明

Theme屬性

<!--樣式中,繼承「Theme.AppCompat.Light.NoActionBar」,便沒有ActionBar-->
<style name="VoiceInteractionDialog_theme" parent="Theme.AppCompat.Light.NoActionBar">
    <!--是否全屏-->		
    <item name="android:windowFullscreen">true</item>
    <!--是否顯示ActionBar-->			
    <item name="android:windowNoTitle">true</item>
    <!--是否浮如今activity之上-->
    <item name="android:windowIsFloating">true</item>
    <!--是否半透明-->
    <item name="android:windowIsTranslucent">false</item>
    <!--背景顏色-->
    <item name="android:windowBackground">@android:color/transparent</item>
    <!--彈出Dialog的時候,背景是否模糊-->
    <item name="android:backgroundDimEnabled">true</item>
    <!--Dialog背景的模糊度,1是徹底不透明-->
    <item name="android:backgroundDimAmount">0.7</item>
    <!-- 聲明Dialog的動畫 -->
    <item name="android:windowAnimationStyle">@style/anim</item>
</style>
<!-- 聲明Dialog的動畫 -->
<style name="anim">
    <!-- 進入動畫 -->
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <!-- 退出動畫 -->
    <item name="android:windowExitAnimation">@anim/slide_down</item>
</style>
複製代碼

Java中設置屬性

Dialog在Windows中的位置 getWindow().setGravity(Gravity.CENTER);android

設置任意位置:bash

Window dialogWindow = dialog.getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
dialogWindow.setGravity(Gravity.LEFT | Gravity.TOP);
lp.x = 100; // 新位置X座標
lp.y = 100; // 新位置Y座標
lp.width = 300; // 寬度
lp.height = 300; // 高度
lp.alpha = 0.7f; // 透明度
dialogWindow.setAttributes(lp);
複製代碼

1)Gravity.CENTER_HORIZONTAL * 對話框水平居中,因此lp.x就表示在水平居中的位置移動lp.x像素,正值向右移動,負值向左移動.ide

2)Gravity.CENTER_VERTICAL * 對話框垂直居中,因此lp.y就表示在垂直居中的位置移動lp.y像素,正值向右移動,負值向左移動.動畫

3)gravity的默認值爲Gravity.CENTER, 即Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL.ui

4)Gravity.LEFT 對話框出如今左邊,因此lp.x就表示相對左邊的偏移,負值忽略.spa

5)Gravity.RIGHT 對話框出如今右邊,因此lp.x就表示相對右邊的偏移,負值忽略.code

6)Gravity.TOP 對話框出如今上邊,因此lp.y就表示相對上邊的偏移,負值忽略.繼承

7) Gravity.BOTTOM 對話框出如今下邊,因此lp.y就表示相對下邊的偏移,負值忽略.get

//Dialog的動畫
getWindow().setWindowAnimations(R.style.VoiceInteractionDialog_animation);

//設置Layout的長寬,這裏動態去設置
getWindow().setLayout(context.getResources().getDisplayMetrics().widthPixels,
    WindowManager.LayoutParams.MATCH_PARENT);

//Dialog背景的模糊度,1是徹底不透明
getWindow().setDimAmount(0.7f);

//設置背景Drawable
getWindow().setBackgroundDrawableResource(android.R.color.white);

//清除Dialog底背景模糊和黑暗度
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND |
    WindowManager.LayoutParams.FLAG_DIM_BEHIND);
    
//設置全屏,沒有狀態欄
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN);
複製代碼

3. 全局彈出Dialog

須要權限:<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />animation

相關文章
相關標籤/搜索