Dialog通用属性设置
<style name="DialogStyle" parent="Theme.AppCompat.Dialog">
<!-- 进入和退出时动画-->
<item name="android:windowAnimationStyle">@style/AnimBottom</item>
<!--边框-->
<item name="android:windowFrame">@null</item>
<!--是否浮现在activity之上-->
<item name="android:windowIsFloating">true</item>
<!--半透明-->
<item name="android:windowIsTranslucent">true</item>
<!--无标题-->
<item name="android:windowNoTitle">true</item>
<!--去掉Dialog的标题-->
<item name="windowNoTitle">true</item>
<!--背景透明-->
<item name="android:windowBackground">@android:color/transparent</item>
<!--背景是否变暗-->
<item name="android:backgroundDimEnabled">false</item>
<!-- 点击空白区域是否消失 API Level>=11-->
<item name="android:windowCloseOnTouchOutside">false</item>
</style>
让Dialog外部区域可以正常响应事件
在onCreate
方法中给Window
设置如下属性
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
如果当前Dialog
关心外部的事件,可设置如下属性
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
设置完以后,当外部触发事件时会在当前Dialog
的onTouchEvent
中下发
MotionEvent.ACTION_OUTSIDE
事件,但是需要注意一点,仅在第一次按下时会下发此事件,不能完整接收整个事件过程,另外这两个Flag
的注释如下,大家有兴趣的可以看一下
/** Window flag: even when this window is focusable (its
* {@link #FLAG_NOT_FOCUSABLE} is not set), allow any pointer events
* outside of the window to be sent to the windows behind it. Otherwise
* it will consume all pointer events itself, regardless of whether they
* are inside of the window. */
public static final int FLAG_NOT_TOUCH_MODAL = 0x00000020;
/** Window flag: if you have set {@link #FLAG_NOT_TOUCH_MODAL}, you
* can set this flag to receive a single special MotionEvent with
* the action
* {@link MotionEvent#ACTION_OUTSIDE MotionEvent.ACTION_OUTSIDE} for
* touches that occur outside of your window. Note that you will not
* receive the full down/move/up gesture, only the location of the
* first down as an ACTION_OUTSIDE.
*/
public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000;
网友评论