自定义工具类-----沉浸式标题栏

一、本次用的是java,工具类如下

package bai.bai.bai.demo.systembar;


import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Build.VERSION;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager.LayoutParams;


import java.lang.reflect.Method;

public class SystemBarTintManager {
    public static final int DEFAULT_TINT_COLOR = -1728053248;
    private static String sNavBarOverride;
    private SystemBarTintManager.SystemBarConfig mConfig;
    private boolean mStatusBarAvailable;
    private boolean mNavBarAvailable;
    private boolean mStatusBarTintEnabled;
    private boolean mNavBarTintEnabled;
    private View mStatusBarTintView;//顶部状态栏
    private View mNavBarTintView;//底部导航栏(如华为)

    public SystemBarTintManager(Activity activity) {
        Window win = activity.getWindow();
        ViewGroup decorViewGroup = (ViewGroup) win.getDecorView();
        if (VERSION.SDK_INT >= 19) {
            int[] attrs = new int[]{16843759, 16843760};
            TypedArray a = activity.obtainStyledAttributes(attrs);

            try {
                this.mStatusBarAvailable = a.getBoolean(0, false);
                this.mNavBarAvailable = a.getBoolean(1, false);
            } finally {
                a.recycle();
            }

            LayoutParams winParams = win.getAttributes();
            int bits = 67108864;
            if ((winParams.flags & bits) != 0) {
                this.mStatusBarAvailable = true;
            }

            bits = 134217728;
            if ((winParams.flags & bits) != 0) {
                this.mNavBarAvailable = true;
            }
        }

        this.mConfig = new SystemBarTintManager.SystemBarConfig(activity, this.mStatusBarAvailable, this.mNavBarAvailable);
        if (!this.mConfig.hasNavigtionBar()) {
            this.mNavBarAvailable = false;
        }

        if (this.mStatusBarAvailable) {
            this.setupStatusBarView(activity, decorViewGroup);
        }

        if (this.mNavBarAvailable) {
            this.setupNavBarView(activity, decorViewGroup);
        }

    }

    public void setStatusBarTintEnabled(boolean enabled) {
        this.mStatusBarTintEnabled = enabled;
        if (this.mStatusBarAvailable) {
            this.mStatusBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);//baibai
        }

    }

    public void setNavigationBarTintEnabled(boolean enabled) {
        this.mNavBarTintEnabled = enabled;
        if (this.mNavBarAvailable) {
            this.mNavBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);//baibai
        }

    }

    /**
     * 设置标题栏为某个颜色
     */
    public void setTintColor(int color) {
        this.setStatusBarTintColor(color);
        this.setNavigationBarTintColor(color);
    }

    /**
     * 设置标题栏为某张图片
     */
    public void setTintResource(int res) {
        this.setStatusBarTintResource(res);
        this.setNavigationBarTintResource(res);
    }

    /**
     * 设置标题栏为某张图片
     */
    public void setTintDrawable(Drawable drawable) {
        this.setStatusBarTintDrawable(drawable);
        this.setNavigationBarTintDrawable(drawable);
    }

    /**
     * 设置标题栏透明度
     */
    public void setTintAlpha(float alpha) {
        this.setStatusBarAlpha(alpha);
        this.setNavigationBarAlpha(alpha);
    }

    private void setStatusBarTintColor(int color) {
        if (this.mStatusBarAvailable) {
            this.mStatusBarTintView.setBackgroundColor(color);
        }

    }

    private void setStatusBarTintResource(int res) {
        if (this.mStatusBarAvailable) {
            this.mStatusBarTintView.setBackgroundResource(res);
        }

    }

    private void setStatusBarTintDrawable(Drawable drawable) {
        if (this.mStatusBarAvailable) {
            this.mStatusBarTintView.setBackgroundDrawable(drawable);
        }

    }

    private void setStatusBarAlpha(float alpha) {
        if (this.mStatusBarAvailable) {
            this.mStatusBarTintView.setAlpha(alpha);
        }

    }

    private void setNavigationBarTintColor(int color) {
        if (this.mNavBarAvailable) {
            this.mNavBarTintView.setBackgroundColor(color);
        }

    }

    private void setNavigationBarTintResource(int res) {
        if (this.mNavBarAvailable) {
            this.mNavBarTintView.setBackgroundResource(res);
        }

    }

    private void setNavigationBarTintDrawable(Drawable drawable) {
        if (this.mNavBarAvailable) {
            this.mNavBarTintView.setBackgroundDrawable(drawable);
        }

    }

    private void setNavigationBarAlpha(float alpha) {
        if (this.mNavBarAvailable) {
            this.mNavBarTintView.setAlpha(alpha);
        }

    }

    public SystemBarTintManager.SystemBarConfig getConfig() {
        return this.mConfig;
    }

    public boolean isStatusBarTintEnabled() {
        return this.mStatusBarTintEnabled;
    }

    public boolean isNavigationBarTintEnabled() {
        return this.mNavBarTintEnabled;
    }

    private void setupStatusBarView(Context context, ViewGroup decorViewGroup) {
        this.mStatusBarTintView = new View(context);
        android.widget.FrameLayout.LayoutParams params = new android.widget.FrameLayout.LayoutParams(-1, this.mConfig.getStatusBarHeight());
        params.gravity = 48;
        if (this.mNavBarAvailable && !this.mConfig.isNavigationAtBottom()) {
            params.rightMargin = this.mConfig.getNavigationBarWidth();
        }

        this.mStatusBarTintView.setLayoutParams(params);
        this.mStatusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
        this.mStatusBarTintView.setVisibility(View.GONE);//baibai
        decorViewGroup.addView(this.mStatusBarTintView);
    }

    private void setupNavBarView(Context context, ViewGroup decorViewGroup) {
        this.mNavBarTintView = new View(context);
        android.widget.FrameLayout.LayoutParams params;
        if (this.mConfig.isNavigationAtBottom()) {
            params = new android.widget.FrameLayout.LayoutParams(-1, this.mConfig.getNavigationBarHeight());
            params.gravity = 80;
        } else {
            params = new android.widget.FrameLayout.LayoutParams(this.mConfig.getNavigationBarWidth(), -1);
            params.gravity = 5;
        }

        this.mNavBarTintView.setLayoutParams(params);
        this.mNavBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
        this.mNavBarTintView.setVisibility(View.GONE);//baibai
        decorViewGroup.addView(this.mNavBarTintView);
    }

    public static class SystemBarConfig {
        private final boolean mTranslucentStatusBar;
        private final boolean mTranslucentNavBar;
        private final int mStatusBarHeight;
        private final int mActionBarHeight;
        private final boolean mHasNavigationBar;
        private final int mNavigationBarHeight;
        private final int mNavigationBarWidth;
        private final boolean mInPortrait;
        private final float mSmallestWidthDp;

        private SystemBarConfig(Activity activity, boolean translucentStatusBar, boolean traslucentNavBar) {
            Resources res = activity.getResources();
            this.mInPortrait = res.getConfiguration().orientation == 1;
            this.mSmallestWidthDp = this.getSmallestWidthDp(activity);
            this.mStatusBarHeight = this.getInternalDimensionSize(res, "status_bar_height");
            this.mActionBarHeight = this.getActionBarHeight(activity);
            this.mNavigationBarHeight = this.getNavigationBarHeight(activity);
            this.mNavigationBarWidth = this.getNavigationBarWidth(activity);
            this.mHasNavigationBar = this.mNavigationBarHeight > 0;
            this.mTranslucentStatusBar = translucentStatusBar;
            this.mTranslucentNavBar = traslucentNavBar;
            Log.d("baibai", "actionBarHeight = " + getActionBarHeight() + ", NavigationHeight = " + getNavigationBarHeight());
        }

        private int getActionBarHeight(Context context) {
            int result = 0;
            TypedValue tv = new TypedValue();
            context.getTheme().resolveAttribute(16843499, tv, true);
            result = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics());

            return result;
        }

        private int getNavigationBarHeight(Context context) {
            Resources res = context.getResources();
            int result = 0;
            if (this.hasNavBar(context)) {
                String key;
                if (this.mInPortrait) {
                    key = "navigation_bar_height";
                } else {
                    key = "navigation_bar_height_landscape";
                }

                return this.getInternalDimensionSize(res, key);
            } else {
                return result;
            }
        }

        private int getNavigationBarWidth(Context context) {
            Resources res = context.getResources();
            int result = 0;
            return this.hasNavBar(context) ? this.getInternalDimensionSize(res, "navigation_bar_width") : result;
        }

        private boolean hasNavBar(Context context) {
            Resources res = context.getResources();
            int resourceId = res.getIdentifier("config_showNavigationBar", "bool", "android");
            if (resourceId != 0) {
                boolean hasNav = res.getBoolean(resourceId);
                if ("1".equals(SystemBarTintManager.sNavBarOverride)) {
                    hasNav = false;
                } else if ("0".equals(SystemBarTintManager.sNavBarOverride)) {
                    hasNav = true;
                }

                return hasNav;
            } else {
                return !ViewConfiguration.get(context).hasPermanentMenuKey();
            }
        }

        private int getInternalDimensionSize(Resources res, String key) {
            int result = 0;
            int resourceId = res.getIdentifier(key, "dimen", "android");
            if (resourceId > 0) {
                result = res.getDimensionPixelSize(resourceId);
            }

            return result;
        }

        @SuppressLint({"NewApi"})
        private float getSmallestWidthDp(Activity activity) {
            DisplayMetrics metrics = new DisplayMetrics();
            if (VERSION.SDK_INT >= 16) {
                activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
            } else {
                activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
            }

            float widthDp = (float) metrics.widthPixels / metrics.density;
            float heightDp = (float) metrics.heightPixels / metrics.density;
            return Math.min(widthDp, heightDp);
        }

        private boolean isNavigationAtBottom() {
            return this.mSmallestWidthDp >= 600.0F || this.mInPortrait;
        }

        private int getStatusBarHeight() {
            return this.mStatusBarHeight;
        }

        public int getActionBarHeight() {
            return this.mActionBarHeight;
        }

        private boolean hasNavigtionBar() {
            return this.mHasNavigationBar;
        }

        private int getNavigationBarHeight() {
            return this.mNavigationBarHeight;
        }

        private int getNavigationBarWidth() {
            return this.mNavigationBarWidth;
        }

        public int getPixelInsetTop(boolean withActionBar) {
            return (this.mTranslucentStatusBar ? this.mStatusBarHeight : 0) + (withActionBar ? this.mActionBarHeight : 0);
        }

        public int getPixelInsetBottom() {
            return this.mTranslucentNavBar && this.isNavigationAtBottom() ? this.mNavigationBarHeight : 0;
        }

        public int getPixelInsetRight() {
            return this.mTranslucentNavBar && !this.isNavigationAtBottom() ? this.mNavigationBarWidth : 0;
        }
    }
}

二、引用(activity)

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            val win = window
            val winParams = win.attributes
            val bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
            winParams.flags = winParams.flags or bits
            win.attributes = winParams
            // 创建状态栏的管理实例
            val tintManager = SystemBarTintManager(this)
            // 激活状态栏设置
            tintManager.isStatusBarTintEnabled = true
            tintManager.isNavigationBarTintEnabled = false
            // 设置一个颜色给系统栏
            tintManager.setTintColor(resources.getColor(R.color.colorAccent))
//            tintManager.setTintAlpha(0.3f)
//            tintManager.setTintDrawable(android.support.v4.content.ContextCompat.getDrawable(this,R.drawable.ic_launcher_background))
//            tintManager.setTintResource(R.drawable.pay_icon_ali)
        }

三、在xml里

界面布局根布局里添加属性:

android:fitsSystemWindows="true"

如果有多个activity,修改比较麻烦,可以直接在application的style里添加这个属性,就不用一个activity一个activity添加了

<item name="android:fitsSystemWindows">true</item>

猜你喜欢

转载自blog.csdn.net/qq_36968707/article/details/84104558
今日推荐