方案一:
Activity
的根布局重写 dispatchTouchEvent
方法,监听 ACTION_DOWN
和 ACTION_UP
,然后判断距离差,小于一定距离(时间)则视为点击。
优点:方便快捷
缺点:无法监听到已显示的Dialog
方案二:
添加一个透明的 全屏View
到 WindowManager
中,用来监听和转发 TouchEvent
,并且重写 目标Activity
的 onWindowFocusChanged
方法,每当这个方法被回调时,证明有可能是 Dialog
出现或关闭。因为 Dialog.show()
的原理其实也是 WindowManager.addView()
。所以这时候需要把刚刚添加到 WindowManager
的 透明View
,重新置顶一下: 先remove,再add
,这样就始终在最上面了。
优点:能够监听到显示的Dialog
缺点:这属于悬浮窗,在6.0系统以上需要动态申请权限,对用户来说不友好