教你用PopupWindow實現半屏透明功能

需求

項目中UI爲了實現界面的新穎獨特,會設計各式各樣的優美界面。比如下面的這個效果圖,就是我最近遇到的
在這裏插入圖片描述
看到這個效果的第一眼,你想到的是什麼方法實現。

網友實現

看到此效果的第一眼,我想到的是不大好實現。因爲我曾經看過此效果的demo,demo實現方法過於複雜,因此我首先諮詢了網友,網友的回答果然讓我失望:popupWindow,然後popupWindow之外窗口添加透明色。
在這裏插入圖片描述
如上網友的實現:紅框中是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截圖
在這裏插入圖片描述
爲了精簡講解,就不貼代碼 了。
如上圖分別有紅框、藍框和黑框三部分。它實現下半部分透明的方式很簡單:frameLayout view堆疊,frameLayout爲root view(紅框部分),黑框部分爲frameLayout的子view,黑框有部分view和frameLayout裏的藍框是一樣的。正常情況下黑框部分view隱藏,當點擊藍框時黑框顯示,黑框中透明部分是一個背景色爲透明色的View,以此達到部分屏幕透明的效果。
此種方式是實現複雜,寫重負的View,代碼耦合度高,不推薦。
demo鏈接:https://github.com/sunfusheng/StickyHeaderListView

PopupWindow實現

這裏也只講思路。
還是拿第一個列子來說
在這裏插入圖片描述
此種方法也用的的是堆疊實現。紅框中是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!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章