【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

相关文章
相关标签/搜索