Android 在低版本4.4以上 动态设置状态栏和底部导航栏的背景色

一,xml 布局

这里写图片描述

二,MainActivity 方法

public class MainActivity extends AppCompatActivity {

private Toolbar mToolbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //判断版本,如果[4.4,5.0)就设置状态栏和导航栏为透明
    if (isFitVerson()) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        //设置虚拟导航栏为透明
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    }

    setContentView(R.layout.activity_main3);
    mToolbar = (Toolbar) findViewById(R.id.toolbar);

    //解决低版本4.4+的虚拟导航栏的
    View nav = findViewById(R.id.navagation);

    setSupportActionBar(mToolbar);

    setOrChangeTranslucentColor(mToolbar, nav, Color.BLUE);

}

@SuppressLint("NewApi")
public void setOrChangeTranslucentColor(Toolbar toolbar, View bottomNavigationBar, int translucentPrimaryColor) {
    //判断版本,如果[4.4,5.0)就设置状态栏和导航栏为透明
    if (isFitVerson()) {
        if (toolbar != null) {
            //1.先设置toolbar的高度
            ViewGroup.LayoutParams params = toolbar.getLayoutParams();
            int statusBarHeight = getStatusBarHeight();
            params.height += statusBarHeight;
            toolbar.setLayoutParams(params);
            //2.设置paddingTop,以达到状态栏不遮挡toolbar的内容。
            toolbar.setPadding(
                    toolbar.getPaddingLeft(),
                    toolbar.getPaddingTop() + getStatusBarHeight(),
                    toolbar.getPaddingRight(),
                    toolbar.getPaddingBottom());
            //设置顶部的颜色
            toolbar.setBackgroundColor(translucentPrimaryColor);
        }
        if (bottomNavigationBar != null) {
            //解决低版本4.4+的虚拟导航栏的
            if (hasNavigationBarShow(getWindowManager())) {
                ViewGroup.LayoutParams p = bottomNavigationBar.getLayoutParams();
                p.height += getNavigationBarHeight();
                bottomNavigationBar.setLayoutParams(p);
                //设置底部导航栏的颜色
                bottomNavigationBar.setBackgroundColor(translucentPrimaryColor);
            }
        }
    } else if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        getWindow().setNavigationBarColor(translucentPrimaryColor);
        getWindow().setStatusBarColor(translucentPrimaryColor);
    } else {
        //<4.4的,不做处理
    }
}

//判断是否是合适的低版本
private boolean isFitVerson() {
    return android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT
            && android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP;
}

/**
 * 判断是否有导航栏
 * @param wm
 * @return
 */
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
private boolean hasNavigationBarShow(WindowManager wm){
    Display display = wm.getDefaultDisplay();
    DisplayMetrics outMetrics = new DisplayMetrics();

    //获取整个屏幕的高度
    display.getRealMetrics(outMetrics);
    int heightPixels = outMetrics.heightPixels;
    int widthPixels = outMetrics.widthPixels;

    //获取内容展示部分的高度
    outMetrics = new DisplayMetrics();
    display.getMetrics(outMetrics);
    int heightPixels2 = outMetrics.heightPixels;
    int widthPixels2 = outMetrics.widthPixels;

    LogUtils.e(heightPixels);
    LogUtils.e(heightPixels2);

    int w = widthPixels-widthPixels2;
    int h = heightPixels-heightPixels2;

    LogUtils.e(h);

    return  w>0||h>0;//竖屏和横屏两种情况。
}

/**
 * 获取状态栏的高度
 *
 * @return
 */
private int getStatusBarHeight() {
    return getSystemComponentDimen("status_bar_height");
}

//虚拟导航栏的
private int getNavigationBarHeight() {
    return getSystemComponentDimen("navigation_bar_height");
}

public int getSystemComponentDimen(String dimenName) {
    /**
     * 获取状态栏高度——方法1
     * */
    int statusBarHeight1 = -1;
    //获取status_bar_height资源的ID    (String name, String defType, String defPackage)
    int resourceId = getResources().getIdentifier(dimenName, "dimen", "android");
    if (resourceId > 0) {
        //根据资源ID获取响应的尺寸值
        statusBarHeight1 = getResources().getDimensionPixelSize(resourceId);
    }
    return statusBarHeight1;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值