解决PopupWindow的阴影覆盖问题
版权声明:本文为xing_star原创文章,转载请注明出处!
本文同步自http://javaexception.com/archives/108
PopupWindow阴影覆盖问题
最近这段时间需求不是很多,就有时间解决下之前遗留的小尾巴,比如PopWindow在某些特殊手机上阴影无法覆盖底部,看起来总觉得怪怪的,最近用全面屏手机相对较多,看到这种情况就更加显眼了,强迫症的我立刻动手Fix这个问题。只记得之前是PopWindow是在Android N以上设备显示有问题,记得还是一两年前吧,那个时候还没怎么有全面屏手机的问题。在网上搜了下关于处理全面屏显示PopWindow的问题,找到了想要的答案。
本文以一个完整的sample,描述popWindow在红米6Pro这样的全面屏手机上的使用。
案例描述:
创建一个BasePopWindow类,作为PopWindow的基类。
public abstract class BasePopWindow extends PopupWindow {
private final View content;
protected Activity context;
public BasePopWindow(Activity context) {
super(context);
this.context = context;
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
content = inflater.inflate(getLayoutId(), null);
this.setContentView(content);
this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
this.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
this.setFocusable(true);
this.setOutsideTouchable(true);
this.update();
ColorDrawable dw = new ColorDrawable(Color.parseColor("#80000000"));
this.setBackgroundDrawable(dw);
findAllView(content);
initListener();
}
protected abstract void findAllView(View view);
protected abstract int getLayoutId();
protected abstract void initListener();
}
写一个简单的业务PopWindow,这里只是演示,就弄的比较简单。
public class CustomPopWindow extends BasePopWindow {
public CustomPopWindow(Activity context) {
super(context);
}
@Override
protected void findAllView(View view) {
}
@Override
protected int getLayoutId() {
return R.layout.popwindow_select;
}
@Override
protected void initListener() {
}
public void showPopupWindow(View anchor) {
if (!this.isShowing()) {
show(anchor);
} else {
this.dismiss();
}
}
private void show(View anchor) {
if (Build.VERSION.SDK_INT >= 24) {
Rect rect = new Rect();
anchor.getGlobalVisibleRect(rect);
int height;
if (ScreenUtils.isShowNavBar(context)) {
height = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom;
} else {
height = ScreenUtils.getRealHeight(context) - rect.bottom;
}
setHeight(height);
}
this.showAsDropDown(anchor, 0, 0);
}
}
我们只关注show方法,里面特意判断了是Android N以上的设备,另外又针对Android N以上设备区分了是否是显示了导航栏,这个说法也是别人写的,我的理解是通过计算屏幕高度,真实高度,来判断应该给PopWindow设置多少的高度。这块为何要按照这个逻辑写,我并没有深入研究源码,先满足需求,有时间有条件在深究了。
在MainActivity中响应页面事件。
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text_view);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CustomPopWindow popWindow = new CustomPopWindow(MainActivity.this);
popWindow.showPopupWindow(v);
}
});
}
}
还有部分代码未贴出,在源码中给出,点击原文地址获取源码。
其他资料参考:
PopUpWindow在Android7.0及以上位置和阴影显示问题 https://www.jianshu.com/p/6d8bd97c0e82
Github开源项目BasePopup https://github.com/razerdp/BasePopup
解决PopupWindow的阴影覆盖问题的更多相关文章
- 百度ueditor解决页面组件被覆盖问题
本文不再更新,可能存在内容过时的情况,实时更新请移步原文地址:百度ueditor解决页面组件被覆盖问题: 在使用ueditor的过程中,会出现表单组件被ueditor覆盖的问题,解决的方式如下: ue ...
- box-shadow阴影覆盖问题
“商品库”栏下方阴影被覆盖,解决方法:给“商品库”盒子加“position:relative”
- 解决PopupWindow遮住输入法
1: PopupWindow中的设置 pop.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); pop.setSoftInputMode(Win ...
- 解决mybatis generator无法覆盖XML
今天发现mybatis generator maven plugin在重复生成的时候xml文件只会merge,不会覆盖. 明明在pom.xml中配置了如下: <configuration> ...
- 解决Unity烘焙阴影锯齿精度不足的问题
烘焙阴影锯齿问题 烘焙后阴影锯齿明显,如下图: 烘焙的光照贴图质量主要受LightmapParameters 的Blur Radius和抗锯齿级别影响, 默认最高级别如下: 如果最高级别不能达到好的 ...
- Android 禁止截屏、录屏 — 解决PopupWindow无法禁止录屏问题
项目开发中,为了用户信息的安全,会有禁止页面被截屏.录屏的需求. 这类资料,在网上有很多,一般都是通过设置Activity的Flag解决,如: //禁止页面被截屏.录屏 getWindow().add ...
- ListPopupWindow和Popupwindow的阴影相关问题demo总结
Popupwindow: 优点:可以通过setBackgroundDrawable()来重新设置阴影. 缺点:当AnchorView是可移动的,比如移动到屏幕的左右边界.左下角.右下角时,Popupw ...
- popupWindow设置后完美解决返回键响应无效的方案以及popupWindow背景透明方案
// 点击其他地方消失 viewPuwAddNew.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouc ...
- html/css实现阴影蒙版覆盖原网页并显示浮框的功能
在提供用户修改资料/密码等功能的时候,往往希望给用户这样的使用体验,在不跳转,不弹框的情况下完成对这些功能的操作. 这可以通过一种效果来实现,在同一页面下阴影覆盖整个当前网页并使得原网页中元素无法使用 ...
随机推荐
- Python2X和Python3X 除法运算符的使用:
首先注明:如果没有特别说明,以下内容都是基于python 3.4的. 1. /是精确除法,//是向下取整除法,%是求模 2. %求模是基于向下取整除法规则的 3. 四舍五入取整round, 向零取整i ...
- 视频及MP3 播放浅析 Jplayer参数详细
初识jplayer插件是因为它的兼容性是最好的,可以兼容到IE6,官网上对它兼容性有很详细的说明 这个是我选择使用它的首要原因. 现在从需求上来了解它的使用方法吧.第一个需求:MP3格式的音频在网页播 ...
- BZOJ : [Usaco2013 Nov]Crowded 单调队列
正反两遍个来一次单调队列 DP 即可. Code: #include<cstdio> #include<deque> #include<algorithm> usi ...
- TCP中的RST标志(Reset)详解
在谈RST攻击前,必须先了解TCP:如何通过三次握手建立TCP连接.四次握手怎样把全双工的连接关闭掉.滑动窗口是怎么传输数据的.TCP的flag标志位里RST在哪些情况下出现.下面我会画一些尽量简化的 ...
- MAC下redis的安装和配置
1.下载 打开官网:https://redis.io/ 选择下载你要的版本压缩包 2.安装 打开终端,cd - 将下载的压缩包拷贝到local目录下:sudo cp Downloads/redis-4 ...
- Nginx设置alias别名目录访问phpmyadmin
引言:Nginx服务器通过设置alias别名可以使特定的目录(phpmyadmin目录)不出现在网站根目录下面,即使网站根目录被攻破,也不会影响到phpmyadmin目录里面的文件. 说明: 站点:h ...
- Codeforces 902B - Coloring a Tree
传送门:http://codeforces.com/contest/902/problem/B 本题是一个关于“树”的问题. 有一棵n个结点的有根树,结点按照1~n编号,根结点为1.cv为结点v的色号 ...
- 00063_String类
1.String类的概述 (1)String 类代表字符串: (2)Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现: (3)字符串是常量,它们的值在创建 ...
- 修改电脑名称后,Oracle客户端连不上
有以下几个步骤可以尝试,帮助大家缩小错误范围. 1 命令窗口使用sqlplus查看数据库服务是否正常,如下图,没有出现“连接到:”表示数据库服务不正常. 2 在任务管理器中查看数据库的监听是否已经 ...
- 如何用PYTHON的CGIHTTPSERVER模块模拟POST请求?
这次又要逼真一点点,可以弄POST请求啦. 在WEB根目录下新建cgi-bin目录(据说是规模要求),然后运行命令: python -m CGIHTTPServer CGI-BIN目录下,form.p ...