因 windowIsTranslucent 导致的 dialog弹出背景变暗效果失效的完美解决方案

解决windowIsTranslucent 属性导致的debug

因项目原因,加入了右滑退出的库,使用此类库都必须在style文件里加入
<item name="android:windowIsTranslucent">true</item> 属性,因此属性导致了无数问题,现就一个突出问题提出解决方案。 如何快速集成 右滑退出,请看我的另一篇博客:https://blog.csdn.net/w13576267399/article/details/77238251

遇到问题和解决方案如下:

  1. 为了达到Dialog/PopupWindow弹出变暗效果,我想到了通过给 activity 添加窗体透明度来实现,代码如下
 /**
     * window背景是否变暗
     *
     * @param isDark
     */
 public void setDarkWindow(boolean isDark) {

        Window window = getWindow();
        // 设置窗口里控件的透明度的.0.0全透明.1.0不透明.
        WindowManager.LayoutParams wl = window.getAttributes();
        wl.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
        if (isDark) {
            wl.alpha = 0.6f;
        } else {
            wl.alpha = 1.0f;
        }

    }
2.在使用 windowIsTranslucent 之前,这样做是没有问题的,使用之后,再此弹出dialog时,会意外的发现activity会半透明的显示上一个activity的内容。我认为是这样的:windowIsTranslucent属性会使activity变得半透明,当我们设置了背景颜色时,这个半透明时看不出来的。但当我们设置窗体透明度时,连背景颜色都半透明了,自然会因为这个属性而看到上一层activity。在这里,我的目标是:1.保留右滑退出。2.实现Dialog/PopupWindow弹出背景变暗效果

3.解决方案如下:
    既然右滑退出必须要实现 windowIsTranslucent 属性,那我们就从 dialog 弹出背景变暗的方式入手,我想到了通过给根布局添加一个 View ,给这个 View 设置透明度,在需要的时候显示出来,平时隐藏。下面是我的做法:
   /**
     * 半透明窗体,给Dialog实现背景变暗效果
     */
    public View mDialogView=null;
    /**
     * 根布局
     */
    private FrameLayout rootView = null;

    //首先获得根布局
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        View decorView = getWindow().getDecorView();
        rootView = (FrameLayout) decorView.findViewById(android.R.id.content);
    }

   /**
     * window背景是否变暗
     *
     * @param isDark
     */
    public void setDarkWindow(boolean isDark) {
        //添加一个半透明的view
        if (mDialogView==null) {
            mDialogView = new View(this);
            //设置宽高为全屏
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams
                (LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
            mDialogView.setLayoutParams(layoutParams);
            mDialogView.setVisibility(View.VISIBLE);
            //设置背景颜色为黑色,加上透明度,就会有半透明的黑色蒙版效果
            mDialogView.setBackgroundColor(getResources().getColor(R.color.black));
            //1.0f 不透明/0.0f 透明
            mDialogView.setAlpha(0.6f);
            rootView.addView(mDialogView);
        }
        // 通过显示隐藏的方式来产生背景变暗效果
        if (isDark){
            mDialogView.setVisibility(View.VISIBLE);
        }else{
            mDialogView.setVisibility(View.GONE);
        }
    }
4.完美解决,大家使用 windowIsTranslucent 属性来解决黑白屏启动或者使用右滑退出时要注意,会出现很多意向不到的bug,还会导致生命周期 onStop 不会回调(建议onStop里的操作放到 onPause 中)。希望就此方案能帮助同样遇到此问题的小伙伴,帮到的话给点个赞吧!

猜你喜欢

转载自blog.csdn.net/w13576267399/article/details/82416201