PopupWindow的showAsDropDown

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

需求:

PopupWindow的showAsDropDown_第1张图片

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

PopupWindow的showAsDropDown_第2张图片

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

PopupWindow的showAsDropDown_第3张图片

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

PopupWindow的showAsDropDown_第4张图片

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

PopupWindow的showAsDropDown_第5张图片

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

PopupWindow的showAsDropDown_第6张图片

平移后:

PopupWindow的showAsDropDown_第7张图片

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

PopupWindow的showAsDropDown_第8张图片

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

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);

你可能感兴趣的:(安卓学习)