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