zoukankan      html  css  js  c++  java
  • 解决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

  • 相关阅读:
    c++ cout、cin、endl
    c++ namespace
    找到小镇的法官
    整数反转
    c++stack类的用法
    栈应用:最小栈(第二题)
    栈的压入、弹出序列(第一题)
    c++中vector类的用法
    Android 面试常问七道题
    传感器实现仿微信摇一摇功能
  • 原文地址:https://www.cnblogs.com/xing-star/p/10957871.html
Copyright © 2011-2022 走看看