Android PopuWindow显示位置那些事儿

时间:2021-07-04 00:27:29

   最近在项目中,需要做这样一个需求,类似一个带着阴影的弹窗,在某个控件的下面如图所示:Android PopuWindow显示位置那些事儿

   如图所示的这个弹窗在一排的TextView的下方,这个弹窗用Dialog并不是特别好实现,所以我采用了PopuWindow去实现它,结果发现了很多的坑。首先我们上核心代码:

/**
     * PopuWindow显示在某个控件的下面
     * @param v 需要PopuWindow在这个控件的下方
     */
    private void showWindow(View v)
    {
        View layout = LayoutInflater.from(getActivity()).inflate(R.layout.window_discover_hero_search_type, null);
        int[] location = new int[2];
        v.getLocationOnScreen(location);
        int[] mScreen = ScreenUtils.getScreen(getActivity());
        int mHeight = v.getBottom() - v.getTop();//获取控件的高度
        mWindow = new PopupWindow(layout, AutoRelativeLayout.LayoutParams.MATCH_PARENT, mScreen[1] - location[1] - mHeight);
        RecyclerView mChild = layout.findViewById(R.id.child);
        GridLayoutManager manager = new GridLayoutManager(getActivity(), 4);
        mChild.setLayoutManager(manager);
        HeroSearchAdapter adapter = new HeroSearchAdapter(getActivity());
        mChild.setAdapter(adapter);
        adapter.update(new String[]{"全部", "金币", "点券", "字母"});
        mWindow.showAsDropDown(v);
    }
   我想说的是两个方法:第一,
int[] location = new int[2];
v.getLocationOnScreen(location);
这个是获取控件在屏幕上的绝对位置坐标的,包含了状态栏的高度;

第二就是PopuWindow的初始化函数,

new PopupWindow(layout, AutoRelativeLayout.LayoutParams.MATCH_PARENT, mScreen[1] - location[1] - mHeight);
无论你的Popuwindow的位置设置在哪里,
mWindow.showAsDropDown(v);
只要初始化函数中的高度是多少就是多少,举个例子,你现在想设置在一个TextView的下方,并且撑满下方的整个布局,但是该TextView下方的高度有300像素,而你在初始化的时候设置PopuWindow的高度为:Match或者大于300,在显示的时候都会撑满整个布局,并且会往上顶,达不到想要的效果。但是如果小于300,或者刚刚设置为300呢?Android存在适配的问题,换个屏幕或者机型,就会很难看,下面放出上面的ScreenUtils的代码,获取Android手机屏幕的尺寸:

//获取手机屏幕的宽高
    public static int[] getScreen(Context mContext)
    {
        WindowManager mManager = (WindowManager) mContext.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        mManager.getDefaultDisplay().getMetrics(outMetrics);
        return new int[]{outMetrics.widthPixels, outMetrics.heightPixels};
    }
最后:祝愿:所有的码农们,工作少bug,生活都美女~~~