android 变色状态栏
2016-05-10 17:04
393 查看
最近想着让自己做的app看起来好看点。。所以给自己的app添加了可以变色的状态栏。。我没有做向下的兼容。。。只能手机版本是4.4及以上的手机使用。网上有人叫沉浸式,我觉着这边博主的解释是正确的:
Android 实现变色状态栏
特别重要的一步:
Activity一定要使用一种主题!
这里我使用的是默认的主题,看你自己需要使用。
1,首先在activity的onCreate方法中,将标题栏设置为透明:
2,然后为了不让自己的顶部控件向上移动,需要在布局文件的顶部控件里面添加以下两句话:
3,然后如果你的顶部控件的背景颜色是蓝色,那么你的标题栏也会变成蓝色:
可以看下以下的效果图:
分享:
这里是一位简书上的大神写的一个工具类我用着挺好。。。分享给大家。。也谢谢大神的分享:
需要自行下载一个开源库SystemBarTint
有时间我也要把这个开源库的源码看一下,学习一下!
这个工具类具体的功能作者备注的也很详细!
我写了一个小demo,需要的可以下载看看~
https://github.com/slyjs/StatusTintDemo.git
需要学习的好多啊思密达!!!!
Android 实现变色状态栏
特别重要的一步:
Activity一定要使用一种主题!
android:theme="@style/AppTheme.NoActionBar"
这里我使用的是默认的主题,看你自己需要使用。
1,首先在activity的onCreate方法中,将标题栏设置为透明:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); }
2,然后为了不让自己的顶部控件向上移动,需要在布局文件的顶部控件里面添加以下两句话:
android:fitsSystemWindows="true" android:clipToPadding="true"
3,然后如果你的顶部控件的背景颜色是蓝色,那么你的标题栏也会变成蓝色:
可以看下以下的效果图:
分享:
这里是一位简书上的大神写的一个工具类我用着挺好。。。分享给大家。。也谢谢大神的分享:
需要自行下载一个开源库SystemBarTint
有时间我也要把这个开源库的源码看一下,学习一下!
public class StatusBarUtil { /** * 修改状态栏为全透明 * * @param activity */ @TargetApi(19) public static void transparencyBar(Activity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = activity.getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); window.setNavigationBarColor(Color.TRANSPARENT); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window window = activity.getWindow(); window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } } /** * 修改状态栏颜色,支持4.4以上版本 * * @param activity * @param colorId */ public static void setStatusBarColor(Activity activity, int colorId) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = activity.getWindow(); // window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(activity.getResources().getColor(colorId)); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //使用SystemBarTint库使4.4版本状态栏变色,需要先将状态栏设置为透明 transparencyBar(activity); SystemBarTintManager tintManager = new SystemBarTintManager(activity); tintManager.setStatusBarTintEnabled(true); tintManager.setNavigationBarTintEnabled(true); tintManager.setStatusBarTintResource(colorId); } } /** * 设置状态栏黑色字体图标, * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android * * @param activity * @return 1:MIUUI 2:Flyme 3:android6.0 */ public static int StatusBarLightMode(Activity activity) { int result = 0; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (MIUISetStatusBarLightMode(activity.getWindow(), true)) { result = 1; } else if (FlymeSetStatusBarLightMode(activity.getWindow(), true)) { result = 2; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); result = 3; } } return result; } /** * 已知系统类型时,设置状态栏黑色字体图标。 * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android * * @param activity * @param type 1:MIUUI 2:Flyme 3:android6.0 */ public static void StatusBarLightMode(Activity activity, int type) { if (type == 1) { MIUISetStatusBarLightMode(activity.getWindow(), true); } else if (type == 2) { FlymeSetStatusBarLightMode(activity.getWindow(), true); } else if (type == 3) { activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View .SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } } /** * 清除MIUI或flyme或6.0以上版本状态栏黑色字体 */ public static void StatusBarDarkMode(Activity activity, int type) { if (type == 1) { MIUISetStatusBarLightMode(activity.getWindow(), false); } else if (type == 2) { FlymeSetStatusBarLightMode(activity.getWindow(), false); } else if (type == 3) { activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); } } /** * 设置状态栏图标为深色和魅族特定的文字风格 * 可以用来判断是否为Flyme用户 * * @param window 需要设置的窗口 * @param dark 是否把状态栏字体及图标颜色设置为深色 * @return boolean 成功执行返回true */ public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) { boolean result = false; if (window != null) { try { WindowManager.LayoutParams lp = 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(lp); if (dark) { value |= bit; } else { value &= ~bit; } meizuFlags.setInt(lp, value); window.setAttributes(lp); result = true; } catch (Exception e) { } } return result; } /** * 设置状态栏字体图标为深色,需要MIUIV6以上 * * @param window 需要设置的窗口 * @param dark 是否把状态栏字体及图标颜色设置为深色 * @return boolean 成功执行返回true */ public static boolean MIUISetStatusBarLightMode(Window window, boolean dark) { boolean result = false; if (window != null) { Class 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); if (dark) { extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体 } else { extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体 } result = true; } catch (Exception e) { } } return result; } }
这个工具类具体的功能作者备注的也很详细!
我写了一个小demo,需要的可以下载看看~
https://github.com/slyjs/StatusTintDemo.git
需要学习的好多啊思密达!!!!
相关文章推荐
- android学习之路 Handler用法
- Android 强大的图片加载缓存— Glide
- Android------startActivityForResult的详细用法
- Android屏幕保护KeyguardManager相关内容学习
- Android Studio 配置ADV发生异常“VT -x is desabled in BIOS”
- Android 网易云课堂第一周笔记16/5/10
- Android为什么要设计出Bundle而不是直接使用HashMap来进行数据传递?
- Android ScrollView如何设置maxHeight
- Android开发工具类之DownloadManagerPro
- Android代码中给获取到的数据添加空格的适配问题
- [置顶] android Git命令家底儿及Git数据通信原理详解
- android Git命令家底儿及Git数据通信原理详解
- android Git命令家底儿及Git数据通信原理详解
- 解决Android原生TextView显示中英文等末尾参差不齐问题
- 控制ListView的自动滚动
- Android 插件化框架 DynamicLoadApk 源码解析
- Android Framework --- PackageManager 分析
- Android如何编译userDebug版本
- Android性能分析工具之TraceView
- Android实现天气查询