Android5.0使用全透明状态栏

xiaoxiao2021-02-27  176

由于项目需求

         实现全透明状态栏, 当透明栏是纯色的时候,设置需求所需的颜色.

在适配5.0以上项目的时候的标题栏会出现一个半透明的阴影模式遮罩,效果很差. 虽然网上有代码是可以实现上部状态栏透明,但是结果下面的导航栏也透明了,虽然想过读取导航栏高度的方式,但是有些手机没有实体按键, 无奈之下只好摸索window的flag 终于找到以下解决办法:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //5.0及以上,不设置透明状态栏,设置会有半透明阴影 Window window=activity.getWindow(); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); /* 这样设置状态栏和导航栏都透明了 Window window = getWindow(); View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT);*/ } else { //。。。。 activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); }

另外扩展下:

import android.app.Activity; import android.graphics.Color; import android.os.Build; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.LinearLayout; /** * 状态栏的实现封装类 * - 完成以下两种功能: * 1,设置一个纯色,适配4.4并以上,需要处理5.0并以上的阴影效果 * 2,当顶部是一个图片,上移到状态栏 * */ public class StatusBarUtils { /** * acitivity中的activity中的状态栏设置为一个纯色 * * @param activity 需要设置的activity * @param color 设置的颜色(一般是titlebar的颜色) */ public static void setColor(Activity activity, int color) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //5.0及以上,不设置透明状态栏,设置会有半透明阴影 activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //设置statusBar的背景色 activity.getWindow().setStatusBarColor(color); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // 生成一个状态栏大小的矩形 View statusView = createStatusBarView(activity, color); // 添加 statusView 到布局中 ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); decorView.addView(statusView); //让我们的activity_mainxml中的布局适应屏幕 setRootView(activity); } } /** * 当顶部是图片时,是图片显示到状态栏上 * * @param activity */ public static void setImage(Activity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //5.0及以上,不设置透明状态栏,设置会有半透明阴影 Window window = activity.getWindow(); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); /* Window window = getWindow(); View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT);*/ } else { //。。。。 activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } } /** * 设置根布局参数,让跟布局参数适应透明状态栏 */ private static void setRootView(Activity activity) { //获取到activity_main.xml文件 ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0); //如果不是设置参数,会使内容显示到状态栏上 rootView.setFitsSystemWindows(true); } /** * 获取状态栏的高度 * * @param acitivity * @return */ private static int getStatusBarHeight(Activity acitivity) { int resourceId = acitivity.getResources().getIdentifier("status_bar_height", "dimen", "android"); return acitivity.getResources().getDimensionPixelOffset(resourceId); } /** * 生成一个和状态栏大小相同的矩形条 * * @param activity 需要设置的activity * @param color 状态栏颜色值 * @return 状态栏矩形条 */ private static View createStatusBarView(Activity activity, int color) { // 绘制一个和状态栏一样高的矩形 View statusBarView = new View(activity); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); statusBarView.setLayoutParams(params); statusBarView.setBackgroundColor(color); return statusBarView; } }

使用   如果下部是一张图片的时候 只需要使用

StatusBarUtils.setImage(this); 如果下部需要的是纯色,只需要使用 StatusBarUtils.setColor(this,Color.parseColor("#4d000000")); 就行了.

转载请注明原文地址: https://www.6miu.com/read-11791.html

最新回复(0)