失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > (AS笔记)Android全透明沉浸式主题样式——工具类篇

(AS笔记)Android全透明沉浸式主题样式——工具类篇

时间:2024-03-31 01:53:54

相关推荐

(AS笔记)Android全透明沉浸式主题样式——工具类篇

重要须知:工具类中形式参数带有:“ int color ” 设置颜色参数,在Activity调用时,请使用“ContextCompat.getColor(this, R.color.颜色名称)”来绑定颜色,如下:Activity中设置纯色状态栏

StatusBarUtils.setStatusBarSingleColor(this, ContextCompat.getColor(this, R.color.Amber),1f);

***参考网上各类资源,自己归纳的,有需要自取***

工具类全部内容如下:直接粘贴复制使用

/*** created by on /8/22* 描述:沉浸式工具类* Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? 0.2f : 0.3f;* @author ZSAndroid* @create -08-22-00:26*/@SuppressWarnings("unused")public class StatusBarUtils {public static int DEFAULT_COLOR = 0;public static float DEFAULT_ALPHA = 0;public static final int MIN_API = 19;/*** 颜色混合* @param color 透明化颜色* @param alpha 透明度* @return*/public static int mixtureColor(int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {int a = (color & 0xff000000) == 0 ? 0xff : color >>> 24;return (color & 0x00ffffff) | (((int) (a * alpha)) << 24);}/*** 沉浸式主方法+++颜色透明度*/public static void immersive(Window window, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {if (Build.VERSION.SDK_INT >= 21) {window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.setStatusBarColor(mixtureColor(color, alpha));window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);} else if (Build.VERSION.SDK_INT >= 19) {window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);setTranslucentView((ViewGroup) window.getDecorView(), color, alpha);} else if (Build.VERSION.SDK_INT >= MIN_API && Build.VERSION.SDK_INT > 16) {int systemUiVisibility = window.getDecorView().getSystemUiVisibility();systemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;systemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE;window.getDecorView().setSystemUiVisibility(systemUiVisibility);}}/** 依赖沉浸式主方法 */public static void immersive(Activity activity, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {immersive(activity.getWindow(), color, alpha);}/** 依赖沉浸式主方法 */public static void immersive(Activity activity, int color) {immersive(activity.getWindow(), color, 1f);}/** 依赖沉浸式主方法 */public static void immersive(Window window) {immersive(window, DEFAULT_COLOR, DEFAULT_ALPHA);}/** 依赖沉浸式主方法 */public static void immersive(Window window, int color) {immersive(window, color, 1f);}/*** 夜间主题模式*/public static void darkMode(Activity activity, boolean dark) {if (isFlyme4Later()) {darkModeForFlyme4(activity.getWindow(), dark);} else if (isMIUI6Later()) {darkModeForMIUI6(activity.getWindow(), dark);} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {setStatusDarkColor(activity.getWindow(), dark);}}/*** 设置状态栏darkMode,字体颜色及icon变黑(目前支持MIUI6以上,Flyme4以上,Android M以上)*/public static void darkMode(Window window, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {if (isFlyme4Later()) {darkModeForFlyme4(window, true);immersive(window, color, alpha);} else if (isMIUI6Later()) {darkModeForMIUI6(window, true);immersive(window, color, alpha);} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {setStatusDarkColor(window, true);immersive(window, color, alpha);} else if (Build.VERSION.SDK_INT >= 19) {window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);setTranslucentView((ViewGroup) window.getDecorView(), color, alpha);} else {immersive(window, color, alpha);}if (Build.VERSION.SDK_INT >= 21) {window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.setStatusBarColor(Color.TRANSPARENT);} else if (Build.VERSION.SDK_INT >= 19) {window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}setTranslucentView((ViewGroup) window.getDecorView(), color, alpha);}/*** 设置状态栏darkMode,字体颜色及icon变黑(目前支持MIUI6以上,Flyme4以上,Android M以上)*/public static void darkMode(Activity activity) {darkMode(activity.getWindow(), DEFAULT_COLOR, DEFAULT_ALPHA);}public static void darkMode(Activity activity, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {darkMode(activity.getWindow(), color, alpha);}/*** 代码实现android:fitsSystemWindows** @param activity*/public static void setRootViewFitsSystemWindows(Activity activity, boolean fitSystemWindows) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {ViewGroup winContent = (ViewGroup) activity.findViewById(android.R.id.content);if (winContent.getChildCount() > 0) {ViewGroup rootView = (ViewGroup) winContent.getChildAt(0);if (rootView != null) {rootView.setFitsSystemWindows(fitSystemWindows);}}}}/*** 全屏显示:顶部状态栏透明+底部导航栏透明** @param activity*/public static void fullScreen(Activity activity) {/**Android当前SDK版本号 > API 19-Android 4.4*/if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//设置顶部状态栏半透明activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//设置底部状导航栏半透明activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);}/**Android当前SDK版本号 > API 21-Android 5.0*/if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS//设置顶部状态栏半透明| WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//设置底部状导航栏半透明activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_STABLE| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION //隐藏底部导航栏| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);activity.getWindow().setNavigationBarColor(Color.TRANSPARENT);//底部导航栏透明——API 21 后开饭的属性//顶部状态栏透明——Android 5.0+ 的属性activity.getWindow().setStatusBarColor(Color.TRANSPARENT);}activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//设置不能横屏}/*** 顶部状态栏半透明*/public static void setStatusTranslucent(Activity activity) {// 若没有指定属性,顶部状态栏默认浅灰色activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}/*** 顶部状态栏全透明*/public static void setStatusTransparent(Activity activity) {immersive(activity, DEFAULT_COLOR, DEFAULT_ALPHA);}/*** 底部状导航栏半透明*/public static void setBottomNavigationTranslucent(Activity activity) {// 若没有指定属性,顶部状态栏默认浅灰色activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);}/*** 顶部状态栏半透明+底部状导航栏半透明*/public static void setStatusBottomAndNavigationTranslucent(Activity activity) {// 若没有指定属性,顶部状态栏默认浅灰色activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);// 若没有指定属性,顶部状态栏默认浅灰色activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);}/*** API 21-Android 5.0* 隐藏底部导航栏——触屏弹出失效*/public static void setHideFixNaviCation(Activity activity) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//隐藏底部导航栏activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);}}/*** 自动固定隐藏底部导航栏* 监听手势——上滑弹出=不失效*/public static void setAutoFixHideNaviCation(Activity activity) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//自动隐藏底部导航栏+强制固定布局activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);}}/*** API 21-Android 5.0* 设置状态栏单一纯色* 调用格式:StatusBarUtils.setStatusBarSingleColor(this, ContextCompat.getColor(this, R.color.Amber),1f);*/public static void setStatusBarSingleColor(Activity activity, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {if (Build.VERSION.SDK_INT >= 21) {activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);activity.getWindow().setStatusBarColor(mixtureColor(color, alpha));activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);}}/*** API 23-Android 6.0* 设置状态栏主题颜色*/public static void setStatusDarkColor(Window window, boolean dark) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {int systemUiVisibility = window.getDecorView().getSystemUiVisibility();if (dark) {systemUiVisibility |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;} else {systemUiVisibility &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;}window.getDecorView().setSystemUiVisibility(systemUiVisibility);}}/*** 增加View的paddingTop,增加的值为状态栏高度*/public static void setPadding(Context context, View view) {if (Build.VERSION.SDK_INT >= MIN_API) {view.setPadding(view.getPaddingLeft(), view.getPaddingTop() + getStatusBarHeight(context),view.getPaddingRight(), view.getPaddingBottom());}}/*** 增加View的paddingTop,增加的值为状态栏高度 (智能判断,并设置高度)*/public static void setPaddingSmart(Context context, View view) {if (Build.VERSION.SDK_INT >= MIN_API) {ViewGroup.LayoutParams lp = view.getLayoutParams();if (lp != null && lp.height > 0) {lp.height += getStatusBarHeight(context);//增高}view.setPadding(view.getPaddingLeft(), view.getPaddingTop() + getStatusBarHeight(context),view.getPaddingRight(), view.getPaddingBottom());}}/*** 增加View的高度以及paddingTop,增加的值为状态栏高度.一般是在沉浸式全屏给ToolBar用的*/public static void setHeightAndPadding(Context context, View view) {if (Build.VERSION.SDK_INT >= MIN_API) {ViewGroup.LayoutParams lp = view.getLayoutParams();lp.height += getStatusBarHeight(context);//增高view.setPadding(view.getPaddingLeft(), view.getPaddingTop() + getStatusBarHeight(context),view.getPaddingRight(), view.getPaddingBottom());}}/*** 增加View上边距(MarginTop)一般是给高度为 WARP_CONTENT 的小控件用的*/public static void setMargin(Context context, View view) {if (Build.VERSION.SDK_INT >= MIN_API) {ViewGroup.LayoutParams lp = view.getLayoutParams();if (lp instanceof ViewGroup.MarginLayoutParams) {((ViewGroup.MarginLayoutParams) lp).topMargin += getStatusBarHeight(context);//增高}view.setLayoutParams(lp);}}/*** 创建假的透明栏*/public static void setTranslucentView(ViewGroup container, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {if (Build.VERSION.SDK_INT >= 19) {int mixtureColor = mixtureColor(color, alpha);View translucentView = container.findViewById(android.R.id.custom);if (translucentView == null && mixtureColor != 0) {translucentView = new View(container.getContext());translucentView.setId(android.R.id.custom);ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(container.getContext()));container.addView(translucentView, lp);}if (translucentView != null) {translucentView.setBackgroundColor(mixtureColor);}}}/*** 获取状态栏高度*/public static int getStatusBarHeight(Context context) {int result = 24;int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");if (resId > 0) {result = context.getResources().getDimensionPixelSize(resId);} else {result = (int) TypedValue.applyDimension(PLEX_UNIT_DIP,result, Resources.getSystem().getDisplayMetrics());}return result;}/*** 设置Flyme4+的darkMode,darkMode时候字体颜色及icon变黑*/public static boolean darkModeForFlyme4(Window window, boolean dark) {boolean result = false;if (window != null) {try {WindowManager.LayoutParams e = window.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(e);if (dark) {value |= bit;} else {value &= ~bit;}meizuFlags.setInt(e, value);window.setAttributes(e);result = true;} catch (Exception var8) {Log.e("StatusBar", "darkIcon: failed");}}return result;}/*** 设置MIUI6+的状态栏是否为darkMode,darkMode时候字体颜色及icon变黑*/public static boolean darkModeForMIUI6(Window window, boolean darkmode) {Class<? extends Window> clazz = window.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);extraFlagField.invoke(window, darkmode ? darkModeFlag : 0, darkModeFlag);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 判断是否Flyme4以上*/public static boolean isFlyme4Later() {return Build.FINGERPRINT.contains("Flyme_OS_4")|| Build.VERSION.INCREMENTAL.contains("Flyme_OS_4")|| pile("Flyme OS [4|5]", Pattern.CASE_INSENSITIVE).matcher(Build.DISPLAY).find();}/*** 判断是否为MIUI6以上*/public static boolean isMIUI6Later() {try {Class<?> clz = Class.forName("android.os.SystemProperties");Method mtd = clz.getMethod("get", String.class);String val = (String) mtd.invoke(null, "ro.miui.ui.version.name");val = val.replaceAll("[vV]", "");int version = Integer.parseInt(val);return version >= 6;} catch (Exception e) {return false;}}}

仅自己学习记录,如有错误,敬请谅解~,谢谢~~~

如果觉得《(AS笔记)Android全透明沉浸式主题样式——工具类篇》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。