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);
}
}
}
}
复制代码
<!--样式中,继承“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>
复制代码
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);
复制代码
须要权限:<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
animation