需求

项目中UI为了实现界面的新颖独特,会设计各式各样的优美界面。比如下面的这个效果图,就是我最近遇到的

Android alpha 半透明 半透明屏幕_Android alpha 半透明


看到这个效果的第一眼,你想到的是什么方法实现。

网友实现

看到此效果的第一眼,我想到的是不大好实现。因为我曾经看过此效果的demo,demo实现方法过于复杂,因此我首先咨询了网友,网友的回答果然让我失望:popupWindow,然后popupWindow之外窗口添加透明色。

Android alpha 半透明 半透明屏幕_android_02


如上网友的实现:红框中是popupWindow的内容,然后在popupWindow显示的时候设置window的透明度,window消失的时候设置回原来的透明度,代码类似如下:

private void windowAipha(float alpha) {
        WindowManager.LayoutParams attributes = getWindow().getAttributes();
        attributes.alpha = alpha;
        getWindow().setAttributes(attributes);
    }

期望很美好,现实很骨感。popupWindow真实的效果是除了popupWindow的区域之外,其它都是带有透明度的。
所以网友的实现失败!

网上demo实现

demo效果图:https://raw.githubusercontent.com/sunfusheng/StickyHeaderListView/master/resources/stickyheader2.gif demo截图

Android alpha 半透明 半透明屏幕_android_03


为了精简讲解,就不贴代码 了。

如上图分别有红框、蓝框和黑框三部分。它实现下半部分透明的方式很简单:frameLayout view堆叠,frameLayout为root view(红框部分),黑框部分为frameLayout的子view,黑框有部分view和frameLayout里的蓝框是一样的。正常情况下黑框部分view隐藏,当点击蓝框时黑框显示,黑框中透明部分是一个背景色为透明色的View,以此达到部分屏幕透明的效果。

此种方式是实现复杂,写重负的View,代码耦合度高,不推荐。

demo链接:https://github.com/sunfusheng/StickyHeaderListView

PopupWindow实现

这里也只讲思路。

还是拿第一个列子来说

Android alpha 半透明 半透明屏幕_Android alpha 半透明_04


此种方法也用的的是堆叠实现。红框中是PopupWindow内容,PopupWindow灰色透明部分也是一个背景为透明色的View。点击户口编号弹出PopupWindow,方式如下:

popupWindow.showAsDropDown(findViewById(R.id.hukou));

弹出PopupWindow,当前窗口的透明度不变,就行了。
此种方式更为简单,代码耦合度也低。推荐使用!

补充

针对Android7.0,PopupWindow弹框的时候需要做特殊适配,不然弹的位置不对。适配如下:

popupWindow = new PopupWindow(getLayoutInflater().inflate(R.layout.pop, null)) {
                @Override
                public void showAsDropDown(View anchor) {
                    if (Build.VERSION.SDK_INT == 24) {
                        // 适配 android 7.0
                        int[] location = new int[2];
                        anchor.getLocationOnScreen(location);
                        showAtLocation(anchor, Gravity.NO_GRAVITY, location[0], location[1] + anchor.getHeight());
                    } else {
                        super.showAsDropDown(anchor);
                    }
                }
            };

还有一个,在部分手机上,需要单独设置PopupWindow的宽高,才能弹出框来:

//不设置宽高魅族手机window弹不出来
popupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);

如果不这样设置,魅族手机就弹不出框。
thanks!