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