Android应用开发Android PopupWindow怎么合理控制弹出位置
白羽 2019-01-14 来源 :网络 阅读 1633 评论 0

摘要:本文将带你了解Android应用开发Android PopupWindow怎么合理控制弹出位置,希望本文对大家学Android有所帮助。

    本文将带你了解Android应用开发Android PopupWindow怎么合理控制弹出位置,希望本文对大家学Android有所帮助。


"
    说到PopupWindow,应该都会有种熟悉的感觉,使用起来也很简单
   
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 一个自定义的布局,作为显示的内容
    Context context = null;  // 真实环境中要赋值
    int layoutId = 0;      // 布局ID
    View contentView = LayoutInflater.from(context).inflate(layoutId,   null);
          
    final PopupWindow popupWindow = new PopupWindow(contentView,
                      LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true);
     
    popupWindow.setTouchable(true);
    // 如果不设置PopupWindow的背景,有些版本就会出现一个问题:无论是点击外部区域还是Back键都无法dismiss弹框
    // 这里单独写一篇文章来分析
    popupWindow.setBackgroundDrawable(new ColorDrawable());
    // 设置好参数之后再show
    popupWindow.showAsDropDown(contentView);
     
   
    如果创建PopupWindow的时候没有指定高宽,那么showAsDropDown默认只会向下弹出显示,这种情况有个最明显的缺点就是:弹窗口可能被屏幕截断,显示不全,所以需要使用到另外一个方法showAtLocation,这个的坐标是相对于整个屏幕的,所以需要我们自己计算位置。
   
      如下图所示,我们可以根据屏幕左上角的坐标A,屏幕高宽,点击View的左上角的坐标C,点击View的大小以及PopupWindow布局的大小计算出PopupWindow的显示位置B
   
   
   
    计算方法源码如下:
   
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    /**
     *   计算出来的位置,y方向就在anchorView的上面和下面对齐显示,x方向就是与屏幕右边对齐显示
     * 如果anchorView的位置有变化,就可以适当自己额外加入偏移来修正
     * @param anchorView  呼出window的view
     * @param contentView   window的内容布局
     * @return   window显示的左上角的xOff,yOff坐标
     */
    private static 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 =   ScreenUtils.getScreenHeight(anchorView.getContext());
        final int screenWidth =   ScreenUtils.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);
        if (isNeedShowUp) {
            windowPos[0] = screenWidth -   windowWidth;
            windowPos[1] = anchorLoc[1] -   windowHeight;
        } else {
            windowPos[0] = screenWidth -   windowWidth;
            windowPos[1] = anchorLoc[1] +   anchorHeight;
        }
        return windowPos;
    }
    接下来调用showAtLoaction显示:
   
    ?
    1
    2
    3
    4
    5
    6
    View windowContentViewRoot = 我们要设置给PopupWindow进行显示的View
    int windowPos[] = calculatePopWindowPos(view, windowContentViewRoot);
    int xOff = 20;// 可以自己调整偏移
    windowPos[0] -= xOff;
    popupwindow.showAtLocation(view, Gravity.TOP | Gravity.START, windowPos[0],   windowPos[1]);
    // windowContentViewRoot是根布局View
    上面的例子只是提供了一种计算方式,在实际开发中可以根据需求自己计算,比如anchorView在左边的情况,在中间的情况,可以根据实际需求写一个弹出位置能够自适应的PopupWindow。
   
    补充上获取屏幕高宽的代码ScreenUtils.java:
   
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /**
     * 获取屏幕高度(px)
     */
    public static int getScreenHeight(Context context) {
        return   context.getResources().getDisplayMetrics().heightPixels;
    }
    /**
     * 获取屏幕宽度(px)
     */
    public static int getScreenWidth(Context context) {
        return   context.getResources().getDisplayMetrics().widthPixels;
    }
    Demo截图展示:
   
   
   
   
   
    "    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程