Android用PopumWindows实现特殊需求

最近有一个特殊的需求----实现按钮点击弹出一个页面,页面在按钮下方显示,下面半透明,上面透明。如图所示

首先想到的是使用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()
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值