在BasePopup中,您可以很轻松的控制事件分发及事件响应,不用担心出现系统PopupWindow各种“返回按键无法屏蔽”,“点击外部不能dismiss”等bug。
【释义】:PopupWindow外部,在BasePopup中,PopupWindow外部指的是PopupContentView外部,可以简单理解为蒙层部分。
通常来说,我们日常使用的事件控制api有如下几个:

方法 描述
setOutSideDismiss 是否允许点击PopupWindow外部时触发dismiss,默为True
- 如果设置为False,则点击蒙层不会触发dismiss
setOutSideTouchable 是否允许PopupWindow外部响应事件,默为False
- 如果设置为True,则蒙层的事件会透传到其下方
setBackPressEnable 是否允许PopupWindow响应返回键并dismiss,默为True
- 如果设置为False,则按下返回键不触发dismiss
setTouchable 设置是否允PopupWindow是否响应事件,默认为True
- 如果设置为False,PopupWindow将不响应任何事件,仅作展示用

有的时候我们需要跟自定义View一样,对按键事件有更多的要求,此时我们可以覆写BasePopup内提供的一些事件方法,去自定义您的逻辑:

方法 描述
onTouchEvent BasePopup最终的代理DecorView的onTouchEvent事件,默认处理了返回键响应
- 如果您在BasePopup中override了该方法并返回了Ture,则意味着您消耗了该事件,BasePopup框架将不再按照默认方法处理,全权交由您处理
onInterceptTouchEvent BasePopup最终的代理DecorView的onInterceptTouchEvent事件
- 如果您在BasePopup中override了该方法并返回了Ture,则意味着您消耗了该事件,BasePopup框架将不再按照默认方法处理,全权交由您处理
onOutSideTouch PopupWindow外部的事件回调,默认处理了点击外部dismiss
- 如果您在BasePopup中override了该方法并返回了Ture,则意味着您消耗了该事件,BasePopup框架将不再按照默认方法处理,全权交由您处理
- 3.1.0版本开始,该方法增加两个参数:
- touchInBackground:是否在背景中中触摸
- isPressed:是否点击事件
onBackPressed PopupWindow中返回键触发回调,默认返回true
- 如果您在BasePopup中override了该方法并返回了Ture,则意味着您消耗了该事件,BasePopup框架将不再按照默认方法处理,全权交由您处理

setOutSideDismiss

是否允许点击PopupWindow外部时触发dismiss,默认为True
ezgif-6-9f58f8b36a8d (1).gif

setOutSideTouchable

是否允许PopupWindow外部响应事件,默认为False
通常搭配setOutSideDismiss使用
ezgif-6-1f85e7b42750.gif

setBackPressEnable

是否允许PopupWindow响应返回键并dismiss,默为True
ezgif-6-28e9db61f937.gif

setTouchable

是否允许PopupWindow是否响应事件,如果不响应,则所有事件穿透Popup(包括ContentView区域及Mask区域),该Popup相当于纯展示使用。

onOutSideTouch

当BasePopup触摸到外部(如:蒙层)时,回调到该方法
参数列表:

参数 描述
MotionEvent event 回调的事件
boolean touchInBackground (2.2.3版本添加) 是否在背景中中触摸(一般指您设置的Drawable或者您的BackgroundView)
boolean isPressed (3.1.0版本添加) 是否点击事件

示例

ezgif-2-1d66ab2d0944.gif