版权声明:本文为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的阴影覆盖问题的更多相关文章

  1. 百度ueditor解决页面组件被覆盖问题

    本文不再更新,可能存在内容过时的情况,实时更新请移步原文地址:百度ueditor解决页面组件被覆盖问题: 在使用ueditor的过程中,会出现表单组件被ueditor覆盖的问题,解决的方式如下: ue ...

  2. box-shadow阴影覆盖问题

    “商品库”栏下方阴影被覆盖,解决方法:给“商品库”盒子加“position:relative”

  3. 解决PopupWindow遮住输入法

    1: PopupWindow中的设置 pop.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); pop.setSoftInputMode(Win ...

  4. 解决mybatis generator无法覆盖XML

    今天发现mybatis generator maven plugin在重复生成的时候xml文件只会merge,不会覆盖. 明明在pom.xml中配置了如下: <configuration> ...

  5. 解决Unity烘焙阴影锯齿精度不足的问题

    烘焙阴影锯齿问题  烘焙后阴影锯齿明显,如下图: 烘焙的光照贴图质量主要受LightmapParameters 的Blur Radius和抗锯齿级别影响, 默认最高级别如下: 如果最高级别不能达到好的 ...

  6. Android 禁止截屏、录屏 — 解决PopupWindow无法禁止录屏问题

    项目开发中,为了用户信息的安全,会有禁止页面被截屏.录屏的需求. 这类资料,在网上有很多,一般都是通过设置Activity的Flag解决,如: //禁止页面被截屏.录屏 getWindow().add ...

  7. ListPopupWindow和Popupwindow的阴影相关问题demo总结

    Popupwindow: 优点:可以通过setBackgroundDrawable()来重新设置阴影. 缺点:当AnchorView是可移动的,比如移动到屏幕的左右边界.左下角.右下角时,Popupw ...

  8. popupWindow设置后完美解决返回键响应无效的方案以及popupWindow背景透明方案

    // 点击其他地方消失 viewPuwAddNew.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouc ...

  9. html/css实现阴影蒙版覆盖原网页并显示浮框的功能

    在提供用户修改资料/密码等功能的时候,往往希望给用户这样的使用体验,在不跳转,不弹框的情况下完成对这些功能的操作. 这可以通过一种效果来实现,在同一页面下阴影覆盖整个当前网页并使得原网页中元素无法使用 ...

随机推荐

  1. DeltaFish 校园物资共享平台 第三次小组会议

    一.想法 娄雨禛: 网页底层开发转移到后端,快速建站,效率高. 可以依照模板进行仿制. 可以考虑只进行页面设计. 但是出现问题不会调试. 所以自己写源码,做出一个大致的样子. 二.上周进度汇报 齐天杨 ...

  2. ajax 三级联动写法

    主页面代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  3. hibernate_05_单表操作_对象类型

    本篇使用hibernate输出一个对象(图片) 先写一个java类 package com.imooc.hibernate; import java.sql.Blob; import java.uti ...

  4. WinDbg使用

    1.抓dump文件 程序崩溃(crash)的时候, 为了以后能够调试分析问题, 可以使用WinDBG要把当时程序内存空间数据都保存下来,生成的文件称为dump 文件. 步骤: 1) 打开WinDBG并 ...

  5. C#—接口和抽象类的区别?

    一.接口 接口是指对协定进行定义的引用类型,其他类型实现接口,以保证它们支持某些操作.接口指定必须由类提供的成员或实现它的其他接口.与类相似,接口可以包含方法.属性.索引器和事件作为成员. 1.接口存 ...

  6. Qt中采用多线程实现Socket编程

    Socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 本文介绍的是Qt中采用多线程Socket编程,由于工作的需要,开始 ...

  7. SUSE 11 SP3 搭建weblogic服务

    环境的搭建和业务需求相关,仅供参考 环境: SUSE 11 SP3 安装步骤 创建一个weblogic组 创建一个用户名为weblogic的用户, 创建相关目录 上传jdk,脚本等 安装 创建用户及其 ...

  8. How to use pthread_create && mutex?

    1 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread. ...

  9. [置顶] Every Programmer Should Know These Latency Numbers

    转自:   https://dzone.com/articles/every-programmer-should-know Every Programmer Should Know These Lat ...

  10. Linux 中, 安装html转pdf工具:wkhtmltopdf

    wkhtmltopdf下载地址官网:https://wkhtmltopdf.org/downloads.html 进入到/opt文件夹下面,新建文件夹wkhtmltopdf,然后把下载好的wkhtml ...