序、周末不加班,
效果图如下。
我们要弹出的PopupWindow在View的下方,如果下方区域不够,则弹出在上方。
实现方案思路
我们在显示的时候,首先去计算一下弹窗高度。使用屏幕的高 - popupwind的高并且和popup的高做对比,如果大于的话,则显示在下方,如果小于的话,则显示在上方。
/**
*
* @param anchorView 锚点View
* @param contentView 弹出的View
* @return
*/
private int[] calculatePopWindowPos(final View anchorView, final View contentView) {
final int[] windowPos = new int[2];
final int[] anchorLoc = new int[2];
// 获取锚点View在屏幕上的左上角坐标位置
anchorView.getLocationOnScreen(anchorLoc);
final int anchorHeight = anchorView.getHeight();
// 获取屏幕的高宽
final int screenHeight = getScreenHeight(anchorView.getContext());
final int screenWidth = getScreenWidth(anchorView.getContext());
contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
// 计算contentView的高宽
final int windowHeight = contentView.getMeasuredHeight();
final int windowWidth = contentView.getMeasuredWidth();
// 判断需要向上弹出还是向下弹出显示
final boolean isNeedShowUp = (screenHeight - anchorLoc[1] - anchorHeight < windowHeight);
Log.i("AAAA", "screenWidth = "+screenWidth+"---"+"windowWidth="+windowWidth);
if (isNeedShowUp) {
windowPos[0] = (screenWidth - windowWidth)/2;
windowPos[1] = anchorLoc[1] - windowHeight;
} else {
windowPos[0] = (screenWidth - windowWidth)/2;
windowPos[1] = anchorLoc[1] + anchorHeight;
}
return windowPos;
}
显示popupwindow如下
Button btn1 = findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
View contentView = LayoutInflater.from(ListActivity.this).inflate(R.layout.layout_window, null);
PopupWindow popupWindow = new PopupWindow(contentView,ViewGroup.LayoutParams.WRAP_CONTENT , ViewGroup.LayoutParams.WRAP_CONTENT);
// 设置PopupWindow可以获得焦点,否则无法响应点击事件
popupWindow.setFocusable(true);
// popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
int[] windowPos = calculatePopWindowPos(view, contentView);
// 3. 显示PopupWindow
popupWindow.showAtLocation(view,Gravity.TOP|Gravity.START, windowPos[0], windowPos[1]);
}
});
完毕。