public void showAsDropDown(View anchor, int xoff, int yoff){}
需求:
我遇到的问题是有一个View,位于屏幕右边边界,但是距离右边有一点距离,大概20dp;要在他的下方显示一个popupWindow,本来挺顺风顺水的,但是除了一个问题,就是popupWindow始终贴着右边界,我尝试修改这个xoff,但是也挺小心的,大概就是10到200这样的试,但是没效果;始终是这样:
后来才知道,这里他是这样思考的,使用showAsDropDown这个方法,他的位置就是popupWindow的ContentView和anchor左下角保持一致;如下所示:
如果这个View是位于屏幕左边,而popupWindow的宽度不是太过分基本上就没问题,但是目前这个View是位于右边,但是下方的popupWindow仍然要和View的左上角要“无缝衔接”,也许你有疑问了,这也没有“无缝衔接”啊!是的,因为下方的popupWindow的宽度太长,如果要“无缝衔接”,popupWindow就要超过屏幕外了;
系统为了杜绝这种情况,就有了一种策略,那就是当要超过屏幕的时候,就把他往左边平移,最终就是我们目前的现状了:
虽然是现状,但不是我们想要的结果,就要解决他,我们把他的x轴方向的偏移量往左平移一个popupWindow的宽度,这样规则就变成了View的左下角和popupWindow的右上角“无缝衔接了”:
平移后:
然后我们再回退一个View的宽度,也就是减去View的宽度就可以了
方案已经有了,那就看看代码
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);