需求
項目中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!