解决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实现阴影蒙版覆盖原网页并显示浮框的功能
在提供用户修改资料/密码等功能的时候,往往希望给用户这样的使用体验,在不跳转,不弹框的情况下完成对这些功能的操作. 这可以通过一种效果来实现,在同一页面下阴影覆盖整个当前网页并使得原网页中元素无法使用 ...
随机推荐
- Java内存机制,内存地址
问题一:String str1 = "abc"; String str2 = "abc"; System.out.println(str1==str2); // ...
- 用SQL Server查询所有数据并显示
利用SQL Server查询数据,并把所有数据显示在页面上. "%> <%@page import="jdbc.sqlServer"%> <%@p ...
- 微软CRM4.0 页面表单和腾讯QQ在线整合
现在通过QQ和客户联系.洽谈业务及沟通感情的场合越来越多,在微软CRM表单上整合QQ可以方便的显示客户QQ在线状态,点击图标即可和客户进行QQ聊天. 客户在线状态: 客户离线状态: 输入QQ号码后即时 ...
- eclipse中导入maven项目:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.proje
org.codehaus.plexus.archiver.jar.Manifest.write(java.io.PrintWriter) 解决方法为:更新eclipse中的maven插件 1.help ...
- Ubuntu 16.04安装和卸载软件命令
安装软件 apt-get install softname1 softname2 softname3…… 卸载软件 apt-get remove softname1 softname2 softnam ...
- CF319E Ping-Pong 线段树 + vector + 思维
Code: #include<bits/stdc++.h> #define N 3000009 #define maxn 3000009 #define ll long long #def ...
- linux中tomcat启动脚本:关闭、发布、重启、测试是否成功
说明 在使用jenkins持续集成时,需要实现自动发布包到tomcat.该脚本实现了在jenkins将包发送到linux服务器上后的自动关闭.发布.启动.测试启动是否成功的过程 思路 该思路以tomc ...
- vue中引入json数据,不用本地请求
1.我的项目结构,需要在Daily.vue中引入daily.js中的json数据 2.把json数据放入一个js文件中,用exports导出,vscode的json格式太严格了,很多数据,调了一个多小 ...
- eas之action的创建
protected KDWorkButton btnFileManage; protected ActionFileManage actionFileManage = null; pub ...
- Qt5.11+opencv3.4的配置安装
系统:Windows 10 64位 前期准备: 1.CMake下载安装 下载地址:https://cmake.org/download/ 选择msi安装文件,按照提示一步一步按照就好 可以参考:htt ...