解决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,覆盖,void,阴影,protected,PopWindow,context,public,View 来源: https://www.cnblogs.com/xing-star/p/10957871.html