关于沉浸式得工具类贼多,只是这个一直在用,样式可以多变设置,调用设置也简单。直接上类:
@TargetApi(Build.VERSION_CODES.KITKAT) public class ImmersionBar { private static Map<String, BarParams> mMap = new HashMap<>(); private Activity mActivity; private Window mWindow; private ViewGroup mViewGroup; private BarParams mBarParams; private ViewGroup mContentView; private BarConfig mConfig; private ImmersionBar() { } private ImmersionBar(Activity activity) { mActivity = activity; mWindow = activity.getWindow(); mViewGroup = (ViewGroup) mWindow.getDecorView(); mContentView = (ViewGroup) mActivity.findViewById(android.R.id.content); mConfig = new BarConfig(activity); if (!mMap.isEmpty()) { if (mMap.get(mActivity.getClass().getName()) == null) { mBarParams = new BarParams(); mMap.put(mActivity.getClass().getName(), mBarParams); } else { mBarParams = mMap.get(mActivity.getClass().getName()); } } else { mBarParams = new BarParams(); mMap.put(mActivity.getClass().getName(), mBarParams); } } /** * With immersion bar. * * @param activity the activity * @return the immersion bar */ public static ImmersionBar with(Activity activity) { return new ImmersionBar(activity); } /** * 透明状态栏,默认透明 * * @return the immersion bar */ public ImmersionBar transparentStatusBar() { mBarParams.statusBarColor = Color.TRANSPARENT; return this; } /** * 透明导航栏,默认黑色 * * @return the immersion bar */ public ImmersionBar transparentNavigationBar() { mBarParams.navigationBarColor = Color.TRANSPARENT; mBarParams.navigationBarColorTem = mBarParams.navigationBarColor; mBarParams.fullScreen = true; return this; } /** * 透明状态栏和导航栏 * * @return the immersion bar */ public ImmersionBar transparentBar() { mBarParams.statusBarColor = Color.TRANSPARENT; mBarParams.navigationBarColor = Color.TRANSPARENT; mBarParams.navigationBarColorTem = mBarParams.navigationBarColor; mBarParams.fullScreen = true; return this; } /** * 状态栏颜色 * * @param statusBarColor 状态栏颜色,资源文件(R.color.xxx) * @return the immersion bar */ public ImmersionBar statusBarColor(@ColorRes int statusBarColor) { mBarParams.statusBarColor = ContextCompat.getColor(mActivity, statusBarColor); return this; } /** * 状态栏颜色 * * @param statusBarColor 状态栏颜色,资源文件(R.color.xxx) * @param alpha the alpha 透明度 * @return the immersion bar */ public ImmersionBar statusBarColor(@ColorRes int statusBarColor, @FloatRange(from = 0f, to = 1f) float alpha) { mBarParams.statusBarColor = ContextCompat.getColor(mActivity, statusBarColor); mBarParams.statusBarAlpha = alpha; return this; } /** * 状态栏颜色 * * @param statusBarColor 状态栏颜色,资源文件(R.color.xxx) * @param statusBarColorTransform the status bar color transform 状态栏变换后的颜色 * @param alpha the alpha 透明度 * @return the immersion bar */ public ImmersionBar statusBarColor(@ColorRes int statusBarColor, @ColorRes int statusBarColorTransform, @FloatRange(from = 0f, to = 1f) float alpha) { mBarParams.statusBarColor = ContextCompat.getColor(mActivity, statusBarColor); mBarParams.statusBarColorTransform = ContextCompat.getColor(mActivity, statusBarColorTransform); mBarParams.statusBarAlpha = alpha; return this; } /** * 导航栏颜色 * * @param navigationBarColor the navigation bar color 导航栏颜色 * @return the immersion bar */ public ImmersionBar navigationBarColor(@ColorRes int navigationBarColor) { mBarParams.navigationBarColor = ContextCompat.getColor(mActivity, navigationBarColor); mBarParams.navigationBarColorTem = mBarParams.navigationBarColor; return this; } /** * 导航栏颜色 * * @param navigationBarColor the navigation bar color 导航栏颜色 * @param navigationAlpha the navigation alpha 透明度 * @return the immersion bar */ public ImmersionBar navigationBarColor(@ColorRes int navigationBarColor, @FloatRange(from = 0f, to = 1f) float navigationAlpha) { mBarParams.navigationBarColor = ContextCompat.getColor(mActivity, navigationBarColor); mBarParams.navigationBarAlpha = navigationAlpha; mBarParams.navigationBarColorTem = mBarParams.navigationBarColor; return this; } /** * 导航栏颜色 * * @param navigationBarColor the navigation bar color 导航栏颜色 * @param navigationBarColorTransform the navigation bar color transform 导航栏变色后的颜色 * @param navigationAlpha the navigation alpha 透明度 * @return the immersion bar */ public ImmersionBar navigationBarColor(@ColorRes int navigationBarColor, @ColorRes int navigationBarColorTransform, @FloatRange(from = 0f, to = 1f) float navigationAlpha) { mBarParams.navigationBarColor = ContextCompat.getColor(mActivity, navigationBarColor); mBarParams.navigationBarColorTransform = ContextCompat.getColor(mActivity, navigationBarColorTransform); mBarParams.navigationBarAlpha = navigationAlpha; mBarParams.navigationBarColorTem = mBarParams.navigationBarColor; return this; } /** * 状态栏和导航栏颜色 * * @param barColor the bar color * @return the immersion bar */ public ImmersionBar barColor(@ColorRes int barColor) { mBarParams.statusBarColor = ContextCompat.getColor(mActivity, barColor); mBarParams.navigationBarColor = Color.BLACK; // mBarParams.navigationBarColorTem = mBarParams.navigationBarColor; return this; } /** * 状态栏和导航栏颜色 * * @param barColor the bar color * @param barAlpha the bar alpha * @return the immersion bar */ public ImmersionBar barColor(@ColorRes int barColor, @FloatRange(from = 0f, to = 1f) float barAlpha) { mBarParams.statusBarColor = ContextCompat.getColor(mActivity, barColor); mBarParams.navigationBarColor = ContextCompat.getColor(mActivity, barColor); mBarParams.navigationBarColorTem = mBarParams.navigationBarColor; mBarParams.statusBarAlpha = barAlpha; mBarParams.navigationBarAlpha = barAlpha; return this; } /** * 状态栏和导航栏颜色 * * @param barColor the bar color * @param barColorTransform the bar color transform * @param barAlpha the bar alpha * @return the immersion bar */ public ImmersionBar barColor(@ColorRes int barColor, @ColorRes int barColorTransform, @FloatRange(from = 0f, to = 1f) float barAlpha) { mBarParams.statusBarColor = ContextCompat.getColor(mActivity, barColor); mBarParams.navigationBarColor = ContextCompat.getColor(mActivity, barColor); mBarParams.navigationBarColorTem = mBarParams.navigationBarColor; mBarParams.statusBarColorTransform = ContextCompat.getColor(mActivity, barColorTransform); mBarParams.navigationBarColorTransform = ContextCompat.getColor(mActivity, barColorTransform); mBarParams.statusBarAlpha = barAlpha; mBarParams.navigationBarAlpha = barAlpha; return this; } /** * 状态栏根据透明度最后变换成的颜色 * * @param statusBarColorTransform the status bar color transform * @return the immersion bar */ public ImmersionBar statusBarColorTransform(@ColorRes int statusBarColorTransform) { mBarParams.statusBarColorTransform = ContextCompat.getColor(mActivity, statusBarColorTransform); return this; } /** * 导航栏根据透明度最后变换成的颜色 * * @param navigationBarColorTransform the m navigation bar color transform * @return the immersion bar */ public ImmersionBar navigationBarColorTransform(@ColorRes int navigationBarColorTransform) { mBarParams.navigationBarColorTransform = ContextCompat.getColor(mActivity, navigationBarColorTransform); return this; } /** * 状态栏和导航栏根据透明度最后变换成的颜色 * * @param barColorTransform the bar color transform * @return the immersion bar */ public ImmersionBar barColorTransform(@ColorRes int barColorTransform) { mBarParams.statusBarColorTransform = ContextCompat.getColor(mActivity, barColorTransform); mBarParams.navigationBarColorTransform = ContextCompat.getColor(mActivity, barColorTransform); return this; } /** * 颜色变换支持View * * @param view the view * @return the view transform color */ public ImmersionBar setViewSupportTransformColor(View view) { mBarParams.view = view; mBarParams.viewColorBeforeTransform = mBarParams.statusBarColor; mBarParams.viewColorAfterTransform = mBarParams.statusBarColorTransform; return this; } /** * 颜色变换支持View * * @param view the view * @param viewColorAfterTransform 变换后的颜色 * @return the view transform color */ public ImmersionBar setViewSupportTransformColor(View view, @ColorRes int viewColorAfterTransform) { mBarParams.view = view; mBarParams.viewColorBeforeTransform = mBarParams.statusBarColor; mBarParams.viewColorAfterTransform = ContextCompat.getColor(mActivity, viewColorAfterTransform); return this; } /** * 颜色变换支持View * * @param view the view * @param viewColorBeforeTransform 变换前的颜色 * @param viewColorAfterTransform 变换后的颜色 * @return the immersion bar */ public ImmersionBar setViewSupportTransformColor(View view, @ColorRes int viewColorBeforeTransform, @ColorRes int viewColorAfterTransform) { mBarParams.view = view; mBarParams.viewColorBeforeTransform = ContextCompat.getColor(mActivity, viewColorBeforeTransform); mBarParams.viewColorAfterTransform = ContextCompat.getColor(mActivity, viewColorAfterTransform); return this; } /** * Add 颜色变换支持View * * @param view the view * @return the immersion bar */ public ImmersionBar addViewSupportTransformColor(View view) { Map<Integer, Integer> map = new HashMap<>(); map.put(mBarParams.statusBarColor, mBarParams.statusBarColorTransform); mBarParams.viewMap.put(view, map); return this; } /** * Add 颜色变换支持View * * @param view the view * @param viewColorAfterTransform the view color after transform * @return the immersion bar */ public ImmersionBar addViewSupportTransformColor(View view, @ColorRes int viewColorAfterTransform) { Map<Integer, Integer> map = new HashMap<>(); map.put(mBarParams.statusBarColor, ContextCompat.getColor(mActivity, viewColorAfterTransform)); mBarParams.viewMap.put(view, map); return this; } /** * Add 颜色变换支持View * * @param view the view * @param viewColorBeforeTransform the view color before transform * @param viewColorAfterTransform the view color after transform * @return the immersion bar */ public ImmersionBar addViewSupportTransformColor(View view, @ColorRes int viewColorBeforeTransform, @ColorRes int viewColorAfterTransform) { Map<Integer, Integer> map = new HashMap<>(); map.put(ContextCompat.getColor(mActivity, viewColorBeforeTransform), ContextCompat.getColor(mActivity, viewColorAfterTransform)); mBarParams.viewMap.put(view, map); return this; } /** * 移除view支持变身 * * @return the immersion bar */ public ImmersionBar removeSupportView() { mBarParams.view = null; return this; } /** * Remove support view immersion bar. * * @param view the view * @return the immersion bar */ public ImmersionBar removeSupportView(View view) { if (view != null) { if (view == mBarParams.view) mBarParams.view = null; Map<Integer, Integer> map = mBarParams.viewMap.get(view); if (map.size() != 0) { mBarParams.viewMap.remove(view); } } return this; } /** * Remove support all view immersion bar. * * @return the immersion bar */ public ImmersionBar removeSupportAllView() { if (mBarParams.viewMap.size() != 0) { mBarParams.viewMap.clear(); } return this; } /** * 有导航栏的情况下,Activity是否全屏显示 * * @param isFullScreen the is full screen * @return the immersion bar */ public ImmersionBar fullScreen(boolean isFullScreen) { mBarParams.fullScreen = isFullScreen; return this; } /** * 状态栏透明度 * * @param statusAlpha the status alpha * @return the immersion bar */ public ImmersionBar statusBarAlpha(@FloatRange(from = 0f, to = 1f) float statusAlpha) { mBarParams.statusBarAlpha = statusAlpha; return this; } /** * 导航栏透明度 * * @param navigationAlpha the navigation alpha * @return the immersion bar */ public ImmersionBar navigationBarAlpha(@FloatRange(from = 0f, to = 1f) float navigationAlpha) { mBarParams.navigationBarAlpha = navigationAlpha; return this; } /** * 状态栏和导航栏透明度 * * @param barAlpha the bar alpha * @return the immersion bar */ public ImmersionBar barAlpha(@FloatRange(from = 0f, to = 1f) float barAlpha) { mBarParams.statusBarAlpha = barAlpha; mBarParams.navigationBarAlpha = barAlpha; return this; } /** * 状态栏字体深色或亮色 * * @param isDarkFont true 深色 * @return the immersion bar */ public ImmersionBar statusBarDarkFont(boolean isDarkFont) { mBarParams.darkFont = isDarkFont; return this; } /** * 隐藏导航栏或状态栏 * * @param barHide the bar hide * @return the immersion bar */ public ImmersionBar hideBar(BarHide barHide) { mBarParams.barHide = barHide; if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { if ((mBarParams.barHide == BarHide.FLAG_HIDE_NAVIGATION_BAR) || (mBarParams.barHide == BarHide.FLAG_HIDE_BAR)) { mBarParams.navigationBarColor = Color.TRANSPARENT; mBarParams.fullScreenTemp = true; } else { mBarParams.navigationBarColor = mBarParams.navigationBarColorTem; mBarParams.fullScreenTemp = false; } } return this; } /** * 解决布局与状态栏重叠问题 * * @param fits the fits * @return the immersion bar */ public ImmersionBar fitsSystemWindows(boolean fits) { mBarParams.fits = fits; return this; } /** * 通过状态栏高度动态设置状态栏布局 * * @param view the view * @return the immersion bar */ public ImmersionBar statusBarView(View view) { mBarParams.statusBarViewByHeight = view; return this; } /** * 通过状态栏高度动态设置状态栏布局,只支持在activity里设置 * * @param viewId the view id * @return the immersion bar */ public ImmersionBar statusBarView(@IntegerRes int viewId) { mBarParams.statusBarViewByHeight = mActivity.findViewById(viewId); return this; } /** * 通过上面配置后初始化后方可成功调用 */ public void init() { mMap.put(mActivity.getClass().getName(), mBarParams); initBar(); //初始化沉浸式 setStatusBarView(); //通过状态栏高度动态设置状态栏布局 fitsSystemWindows(); //解决状态栏和布局重叠问题 transformView(); //变色view } /** * 当Activity关闭的时候,在onDestroy方法中调用 */ public void destroy() { String key = mActivity.getClass().getName(); if (key != null) { if (mBarParams != null) { mBarParams = null; } mMap.remove(key); } } private void initBar() { int uiFlags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE; //防止系统栏隐藏时内容区域大小发生变化 uiFlags = hideBar(uiFlags); //隐藏状态栏或者导航栏 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { uiFlags = setStatusBarDarkFont(uiFlags); //设置状态栏字体为暗色 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { uiFlags |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; //Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态栏遮住。 if (mBarParams.fullScreen) { uiFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; //Activity全屏显示,但导航栏不会被隐藏覆盖,导航栏依然可见,Activity底部布局部分会被导航栏遮住。 } mWindow.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); //取消设置透明状态栏和导航栏 mWindow.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); //需要设置这个才能设置状态栏颜色 mWindow.setStatusBarColor(ColorUtils.blendARGB(mBarParams.statusBarColor, mBarParams.statusBarColorTransform, mBarParams.statusBarAlpha)); //设置状态栏颜色 mWindow.setNavigationBarColor(ColorUtils.blendARGB(mBarParams.navigationBarColor, mBarParams.navigationBarColorTransform, mBarParams.navigationBarAlpha)); //设置导航栏颜色 } else { mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明状态栏 mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//透明导航栏,设置这个,如果有导航栏,底部布局会被导航栏遮住 setupStatusBarView(); //创建一个假的状态栏 if (mConfig.hasNavigtionBar()) //判断是否存在导航栏 setupNavBarView(); //创建一个假的导航栏 // 解决android4.4有导航栏的情况下,activity底部被导航栏遮挡的问题 if (mConfig.hasNavigtionBar() && !mBarParams.fullScreenTemp && !mBarParams.fullScreen) { if (mConfig.isNavigationAtBottom()) //判断导航栏是否在底部 mContentView.setPadding(0, 0, 0, mConfig.getNavigationBarHeight()); //有导航栏,获得rootView的根节点,然后设置距离底部的padding值为导航栏的高度值 else mContentView.setPadding(0, 0, mConfig.getNavigationBarWidth(), 0); //不在底部,设置距离右边的padding值为导航栏的宽度值 } else { mContentView.setPadding(0, 0, 0, 0); //没有导航栏,什么都不做 } } } mWindow.getDecorView().setSystemUiVisibility(uiFlags); } /** * Hide bar. * 隐藏或显示状态栏和导航栏。 状态栏和导航栏的颜色不起作用,都是透明色,以最后一次调用为准 * * @param uiFlags the ui flags * @return the int */ private int hideBar(int uiFlags) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { switch (mBarParams.barHide) { case FLAG_HIDE_BAR: uiFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.INVISIBLE; break; case FLAG_HIDE_STATUS_BAR: uiFlags |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.INVISIBLE; break; case FLAG_HIDE_NAVIGATION_BAR: uiFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; break; case FLAG_SHOW_BAR: uiFlags |= View.SYSTEM_UI_FLAG_VISIBLE; break; } } return uiFlags | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; } /** * Sets status bar dark font. * 设置状态栏字体颜色,android6.0以上或者miuiv6以上或者flymeOS */ private int setStatusBarDarkFont(int uiFlags) { if (Build.VERSION.SDK_INT >= 23 && mBarParams.darkFont) { return uiFlags | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; } else { String MIUIVersion = OSUtils.MIUIVersion(); if (!MIUIVersion.isEmpty() && Integer.valueOf(MIUIVersion.substring(1)) >= 6) { MIUISetStatusBarLightMode(); } else if (OSUtils.isFlymeOS()) { FlymeSetStatusBarLightMode(); } return uiFlags | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; } } /** * 设置状态栏图标为深色和魅族特定的文字风格 * 可以用来判断是否为Flyme用户 * * @return boolean 成功执行返回true */ private boolean FlymeSetStatusBarLightMode() { boolean result = false; if (mWindow != null) { try { WindowManager.LayoutParams lp = mWindow.getAttributes(); Field darkFlag = WindowManager.LayoutParams.class .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); Field meizuFlags = WindowManager.LayoutParams.class .getDeclaredField("meizuFlags"); darkFlag.setAccessible(true); meizuFlags.setAccessible(true); int bit = darkFlag.getInt(null); int value = meizuFlags.getInt(lp); if (mBarParams.darkFont) { value |= bit; } else { value &= ~bit; } meizuFlags.setInt(lp, value); mWindow.setAttributes(lp); result = true; } catch (Exception e) { e.printStackTrace(); } } return result; } /** * 设置状态栏字体图标为深色,需要MIUIV6以上 * * @return boolean 成功执行返回true */ private boolean MIUISetStatusBarLightMode() { boolean result = false; if (mWindow != null) { Class clazz = mWindow.getClass(); try { int darkModeFlag = 0; Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); darkModeFlag = field.getInt(layoutParams); Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); if (mBarParams.darkFont) { extraFlagField.invoke(mWindow, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体 } else { extraFlagField.invoke(mWindow, 0, darkModeFlag);//清除黑色字体 } result = true; } catch (Exception e) { e.printStackTrace(); } } return result; } /** * 变色view * <p> * Transform view. */ private void transformView() { if (mBarParams.view != null) { mBarParams.view.setBackgroundColor(ColorUtils.blendARGB(mBarParams.viewColorBeforeTransform, mBarParams.viewColorAfterTransform, mBarParams.statusBarAlpha)); } if (mBarParams.viewMap.size() != 0) { Set<Map.Entry<View, Map<Integer, Integer>>> entrySet = mBarParams.viewMap.entrySet(); for (Map.Entry<View, Map<Integer, Integer>> entry : entrySet) { View view = entry.getKey(); Map<Integer, Integer> map = entry.getValue(); Integer colorBefore = mBarParams.statusBarColor; Integer colorAfter = mBarParams.statusBarColorTransform; for (Map.Entry<Integer, Integer> integerEntry : map.entrySet()) { colorBefore = integerEntry.getKey(); colorAfter = integerEntry.getValue(); } if (view != null) view.setBackgroundColor(ColorUtils.blendARGB(colorBefore, colorAfter, mBarParams.statusBarAlpha)); } } } /** * 通过状态栏高度动态设置状态栏布局 */ private void setStatusBarView() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && mBarParams.statusBarViewByHeight != null) { ViewGroup.LayoutParams params = mBarParams.statusBarViewByHeight.getLayoutParams(); params.height = mConfig.getStatusBarHeight(); mBarParams.statusBarViewByHeight.setLayoutParams(params); } mBarParams.statusBarViewByHeight = null; } /** * 解决状态栏和布局重叠问题 * Fits system windows. */ private void fitsSystemWindows() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (mBarParams.fits) { mContentView.setPadding(0, getStatusBarHeight(mActivity), 0, 0); } else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) mContentView.setPadding(0, 0, 0, 0); } } } /** * 设置一个可以自定义颜色的状态栏 */ private void setupStatusBarView() { if (mBarParams.statusBarView == null) { mBarParams.statusBarView = new View(mActivity); } FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, getStatusBarHeight(mActivity)); params.gravity = Gravity.TOP; if (!isNavigationAtBottom(mActivity)) { params.rightMargin = getNavigationBarWidth(mActivity); } mBarParams.statusBarView.setLayoutParams(params); mBarParams.statusBarView.setBackgroundColor(ColorUtils.blendARGB(mBarParams.statusBarColor, mBarParams.statusBarColorTransform, mBarParams.statusBarAlpha)); mBarParams.statusBarView.setVisibility(View.VISIBLE); ViewGroup viewGroup = (ViewGroup) mBarParams.statusBarView.getParent(); if (viewGroup != null) viewGroup.removeView(mBarParams.statusBarView); mViewGroup.addView(mBarParams.statusBarView); } /** * 设置一个可以自定义颜色的导航栏 */ private void setupNavBarView() { if (mBarParams.navigationBarView == null) { mBarParams.navigationBarView = new View(mActivity); } FrameLayout.LayoutParams params; if (isNavigationAtBottom(mActivity)) { params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, getNavigationBarHeight(mActivity)); params.gravity = Gravity.BOTTOM; } else { params = new FrameLayout.LayoutParams(getNavigationBarWidth(mActivity), FrameLayout.LayoutParams.MATCH_PARENT); params.gravity = Gravity.END; } mBarParams.navigationBarView.setLayoutParams(params); if (!mBarParams.fullScreen && (mBarParams.navigationBarColorTransform == Color.TRANSPARENT)) { mBarParams.navigationBarView.setBackgroundColor(ColorUtils.blendARGB(mBarParams.navigationBarColor, Color.BLACK, mBarParams.navigationBarAlpha)); } else { mBarParams.navigationBarView.setBackgroundColor(ColorUtils.blendARGB(mBarParams.navigationBarColor, mBarParams.navigationBarColorTransform, mBarParams.navigationBarAlpha)); } mBarParams.navigationBarView.setVisibility(View.VISIBLE); ViewGroup viewGroup = (ViewGroup) mBarParams.navigationBarView.getParent(); if (viewGroup != null) viewGroup.removeView(mBarParams.navigationBarView); mViewGroup.addView(mBarParams.navigationBarView); } /** * Has navigtion bar boolean. * 判断是否存在导航栏 * * @param activity the activity * @return the boolean */ @TargetApi(14) public static boolean hasNavigationBar(Activity activity) { BarConfig config = new BarConfig(activity); return config.hasNavigtionBar(); } /** * Gets navigation bar height. * 获得导航栏的高度 * * @param activity the activity * @return the navigation bar height */ @TargetApi(14) public static int getNavigationBarHeight(Activity activity) { BarConfig config = new BarConfig(activity); return config.getNavigationBarHeight(); } /** * Gets navigation bar width. * 获得导航栏的宽度 * * @param activity the activity * @return the navigation bar width */ @TargetApi(14) public static int getNavigationBarWidth(Activity activity) { BarConfig config = new BarConfig(activity); return config.getNavigationBarWidth(); } /** * Is navigation at bottom boolean. * 判断导航栏是否在底部 * * @param activity the activity * @return the boolean */ @TargetApi(14) public static boolean isNavigationAtBottom(Activity activity) { BarConfig config = new BarConfig(activity); return config.isNavigationAtBottom(); } /** * Gets status bar height. * 或得状态栏的高度 * * @param activity the activity * @return the status bar height */ @TargetApi(14) public static int getStatusBarHeight(Activity activity) { BarConfig config = new BarConfig(activity); return config.getStatusBarHeight(); } /** * Gets action bar height. * 或得ActionBar得高度 * * @param activity the activity * @return the action bar height */ @TargetApi(14) public static int getActionBarHeight(Activity activity) { BarConfig config = new BarConfig(activity); return config.getActionBarHeight(); } /** * Gets bar params. * * @return the bar params */ public BarParams getBarParams() { return mBarParams; } }
功能方法有点多,但都有详细的注释,可以看看自只摘选自己需要的方法。
只对4.4以上版本的bar管理有用,低版本的自己在进行判断吧!
简单调用:
protected void immersionInit(@ColorRes int color, boolean darkFont) { ImmersionBar.with(this) .statusBarDarkFont(darkFont) .barColor(color) .init(); }
设置态栏字体深色或亮色的boolean值,以及状态栏和导航栏的颜色即可。
具体更高级详细的用法看地址学习:https://github.com/gyf-dev/ImmersionBar