版权声明:本文为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. 复习java的例子(第一天)

    1. 编写程序:从键盘上读入一个学生成绩, 存放在变量score中,根据score的值输出其对应的成绩等级: score>=90 等级: A 70=<score<90 等级: B 6 ...

  2. Java_Web之状态管理

    回顾及作业点评: (1)JSP如何处理客户端的请求? 使用response对象处理响应 (2)请描述转发与重定向有何区别? 转发是在服务器端发挥作用,通过forward方法将提交信息在多个页面间进行传 ...

  3. struts 2 action result类型

    最近在管理公司老项目的时候发现如下代码: <bean name="detailPlayer" class="PlayAction" method=&quo ...

  4. Html-如何正确给table加边框

    一般来说,给表格加边框都会出现不同的问题,以下是给表格加边框后展现比较好的方式 <style> table,table tr th, table tr td { border:1px so ...

  5. Codeforces Round #550 (Div. 3)E. Median String

    把字符串看作是26进制的数,从后往前翻译,那么就可以把两个串变成对应的26进制的数字,那么只要把两个数加起来除以二就得到中间的串对应的数了,同理再转化回来就行了.但是这样会有一个问题就是串的长度有2e ...

  6. 通过JDBC取Oracle数据库的时间字段时,时间丢失,只剩日期

    通过JDBC连接Oracle数据库,在查询的时候发现时间字段取出来值后只剩下了日期,时间消失了.查资料发现跟Oracle jdbc驱动版本有关,这里先贴出解决方案: 修改数据库的连接方式: try { ...

  7. C#学习笔记_01_基础内容

    01_基础内容 进(位)制 十进制:逢10进1,数字由0-9组成: 二进制:逢2进1,数字由0-1组成: 八进制:逢8进1,数字由0-7组成: 十六进制:逢16进1,数字由0-9和a-f组成: 进制转 ...

  8. AtCoder ABC 076D - AtCoder Express

    传送门:http://abc076.contest.atcoder.jp/tasks/abc076_d 本题是一个运动学问题——匀变速运动. 一个质点,从静止开始运动.按照速度限制,可将运动划分成n个 ...

  9. 2.3 SVN在myeclipse中的使用

    一.将svn插件文件夹复制到myeclipse的dropins目录下,并重启myeclipse 二.从SVN中检查项目到myeclipse  2.打开myeclipse,点击window的show v ...

  10. lucene_04_解析语法查询

    解析语法查询就是调用方法查询的原始查询 例如: 查询所有的查询器的语法为:*:*,因为lucene查询是根据term来做的,既是:key:value类型.*:*表示所有域中的所有值. api调用语法解 ...