最近有一个特殊的需求----实现按钮点击弹出一个页面,页面在按钮下方显示,下面半透明,上面透明。如图所示
首先想到的是使用popumwindows实现。
实现方式:popumWindows 弹出方式使用showAsDropDown,然后focusable设置为不获取焦点(因为要在弹出的情况下响应页面上面的筛选点击事件)。
遇到问题及解决方法:
1、popumwindows的显示高度:showAsDropDown这种弹出方式,当页面的高度大于触发按钮到页面底部的距离时,页面会覆盖触发按钮。解决方法是动态计算按钮底部到页面底部的距离然后设置弹出页面的高度。
2、因为设置focusable为false所以事件会穿透,当点击触发的按钮时会一直弹出popumwindows,而无法关闭popumwindows
解决办法是在记录一下popumwindows的页面关闭时的时间戳,然后在按钮点击时获取一下当前的时间戳,当这个时间戳小于一定值时就判定为点击同一个按钮,然后不让他触发弹出popumwindows。我实验发现小于300毫秒刚刚好
具体实现方式(代码)
/**
* 计算pop的高度
*/
private fun getPopHeight(): Int {
val dm = DisplayMetrics()
// 获取屏幕信息
activity!!.windowManager.defaultDisplay.getMetrics(dm)
val screenHeigh = dm.heightPixels
val location = IntArray(2)
pw_issue_screen_v.getLocationOnScreen(location)
val y = location[1]
var viewBottom = pw_issue_screen_v.height + y
return screenHeigh - viewBottom
}
//popumWindows属性设置
mWindow.setBackgroundDrawable(mBackground);
mWindow.setOutsideTouchable(true);
mWindow.setFocusable(false);
mWindow.showAsDropDown(anchor, 0, 0);
//时间判断
private inline fun judgeClickSameBtn(time: Long, returnFun: () -> Unit) {
if (System.currentTimeMillis() - time < 300) {
returnFun.invoke()
}
}