Android Completely transparent Status Bar?

前端 未结 28 2757
旧时难觅i
旧时难觅i 2020-11-22 14:10

I\'ve searched the documentation but only found this: Link. Which is used to make the bar translucent? What I\'m trying to do is to make t

28条回答
  •  悲哀的现实
    2020-11-22 14:40

    To draw your layout under statusbar:

    values/styles.xml

    true
    

    values-v21/styles.xml

    true
    @color/colorPrimaryDark
    

    Use CoordinatorLayout/DrawerLayout which already take care of the fitsSystemWindows parameter or create your own layout to like this:

    public class FitsSystemWindowConstraintLayout extends ConstraintLayout {
    
        private Drawable mStatusBarBackground;
        private boolean mDrawStatusBarBackground;
    
        private WindowInsetsCompat mLastInsets;
    
        private Map childsMargins = new HashMap<>();
    
        public FitsSystemWindowConstraintLayout(Context context) {
            this(context, null);
        }
    
        public FitsSystemWindowConstraintLayout(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public FitsSystemWindowConstraintLayout(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
    
            if (ViewCompat.getFitsSystemWindows(this)) {
                ViewCompat.setOnApplyWindowInsetsListener(this, new android.support.v4.view.OnApplyWindowInsetsListener() {
                    @Override
                    public WindowInsetsCompat onApplyWindowInsets(View view, WindowInsetsCompat insets) {
                        FitsSystemWindowConstraintLayout layout = (FitsSystemWindowConstraintLayout) view;
                        layout.setChildInsets(insets, insets.getSystemWindowInsetTop() > 0);
                        return insets.consumeSystemWindowInsets();
                    }
                });
                setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
                TypedArray typedArray = context.obtainStyledAttributes(new int[]{android.R.attr.colorPrimaryDark});
                try {
                    mStatusBarBackground = typedArray.getDrawable(0);
                } finally {
                    typedArray.recycle();
                }
            } else {
                mStatusBarBackground = null;
            }
        }
    
        public void setChildInsets(WindowInsetsCompat insets, boolean draw) {
            mLastInsets = insets;
            mDrawStatusBarBackground = draw;
            setWillNotDraw(!draw && getBackground() == null);
    
            for (int i = 0; i < getChildCount(); i++) {
                View child = getChildAt(i);
                if (child.getVisibility() != GONE) {
                    if (ViewCompat.getFitsSystemWindows(this)) {
                        ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) child.getLayoutParams();
    
                        if (ViewCompat.getFitsSystemWindows(child)) {
                            ViewCompat.dispatchApplyWindowInsets(child, insets);
                        } else {
                            int[] childMargins = childsMargins.get(child);
                            if (childMargins == null) {
                                childMargins = new int[]{layoutParams.leftMargin, layoutParams.topMargin, layoutParams.rightMargin, layoutParams.bottomMargin};
                                childsMargins.put(child, childMargins);
                            }
                            if (layoutParams.leftToLeft == LayoutParams.PARENT_ID) {
                                layoutParams.leftMargin = childMargins[0] + insets.getSystemWindowInsetLeft();
                            }
                            if (layoutParams.topToTop == LayoutParams.PARENT_ID) {
                                layoutParams.topMargin = childMargins[1] + insets.getSystemWindowInsetTop();
                            }
                            if (layoutParams.rightToRight == LayoutParams.PARENT_ID) {
                                layoutParams.rightMargin = childMargins[2] + insets.getSystemWindowInsetRight();
                            }
                            if (layoutParams.bottomToBottom == LayoutParams.PARENT_ID) {
                                layoutParams.bottomMargin = childMargins[3] + insets.getSystemWindowInsetBottom();
                            }
                        }
                    }
                }
            }
    
            requestLayout();
        }
    
        public void setStatusBarBackground(Drawable bg) {
            mStatusBarBackground = bg;
            invalidate();
        }
    
        public Drawable getStatusBarBackgroundDrawable() {
            return mStatusBarBackground;
        }
    
        public void setStatusBarBackground(int resId) {
            mStatusBarBackground = resId != 0 ? ContextCompat.getDrawable(getContext(), resId) : null;
            invalidate();
        }
    
        public void setStatusBarBackgroundColor(@ColorInt int color) {
            mStatusBarBackground = new ColorDrawable(color);
            invalidate();
        }
    
        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            if (mDrawStatusBarBackground && mStatusBarBackground != null) {
                int inset = mLastInsets != null ? mLastInsets.getSystemWindowInsetTop() : 0;
                if (inset > 0) {
                    mStatusBarBackground.setBounds(0, 0, getWidth(), inset);
                    mStatusBarBackground.draw(canvas);
                }
            }
        }
    }
    

    main_activity.xml

    
    
        
    
        
    
        
    
            
        
    
    

    Result:

    Screenshot:

提交回复
热议问题