PopupWindow的showAsDropDown

public void showAsDropDown(View anchor, int xoff, int yoff){}

需求:

TIM截图20190621104408.png-7.6kB

我遇到的问题是有一个View,位于屏幕右边边界,但是距离右边有一点距离,大概20dp;要在他的下方显示一个popupWindow,本来挺顺风顺水的,但是除了一个问题,就是popupWindow始终贴着右边界,我尝试修改这个xoff,但是也挺小心的,大概就是10到200这样的试,但是没效果;始终是这样:

TIM截图20190621104543.png-3.7kB

后来才知道,这里他是这样思考的,使用showAsDropDown这个方法,他的位置就是popupWindow的ContentView和anchor左下角保持一致;如下所示:

TIM截图20190621105354.png-6.8kB

如果这个View是位于屏幕左边,而popupWindow的宽度不是太过分基本上就没问题,但是目前这个View是位于右边,但是下方的popupWindow仍然要和View的左上角要“无缝衔接”,也许你有疑问了,这也没有“无缝衔接”啊!是的,因为下方的popupWindow的宽度太长,如果要“无缝衔接”,popupWindow就要超过屏幕外了;

TIM截图20190621105911.png-3.8kB

系统为了杜绝这种情况,就有了一种策略,那就是当要超过屏幕的时候,就把他往左边平移,最终就是我们目前的现状了:

TIM截图20190621104543.png-3.7kB

虽然是现状,但不是我们想要的结果,就要解决他,我们把他的x轴方向的偏移量往左平移一个popupWindow的宽度,这样规则就变成了View的左下角和popupWindow的右上角“无缝衔接了”:

TIM截图20190621112416.png-5.2kB

平移后:

TIM截图20190621104723.png-4.3kB

然后我们再回退一个View的宽度,也就是减去View的宽度就可以了

TIM截图20190621104408.png-7.6kB

方案已经有了,那就看看代码

private void showMenu(View view) {
    View popupView = getLayoutInflater().inflate(R.layout.menu_discussion_room, null);
    RelativeLayout option1 = popupView.findViewById(R.id.rl_voice);
    final PopupWindow window = new PopupWindow(popupView, LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    window.setAnimationStyle(R.style.popup_window_anim);
    window.setFocusable(true);
    window.setOutsideTouchable(true);
    window.update();
    //关注点---start
    popupView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
    window.showAsDropDown(view, -popupView.getMeasuredWidth() + view.getWidth(), 0);
    //关注点---end
    option1.setOnClickListener(v -> {

        window.dismiss();
    });
}

主要就两行代码:

popupView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
window.showAsDropDown(view, -popupView.getMeasuredWidth() + view.getWidth(), 0);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值