转载请注明出处,感谢您的支持。同时,欢迎加入移动开发学习交流qq群 : 450302004,互相学习。
文章来源:【chenyk的简书】http://www.jianshu.com/p/ef52c16872e6
简单说明
为Android 4.4及以上提供状态栏和系统栏的半透明效果,也就是大部分人所说的沉浸式效果,同时支持图片可浸入状态栏和导航栏,通过链试调用的方式进行设置
效果图
-
Android 4.4 效果
Android 4.4 效果.jpg
-
Android 5.1 效果
Android 5.1 效果.jpg
-
Android 6.0 效果
Android 6.0.jpg
github地址
https://github.com/chenykKits/LutoSystemBar
apk下载
更新日志
V1.0.0
- 为不同安卓版本适配沉浸式效果,仅对Android 4.4及以上有效
- 修改状态栏、导航栏颜色和透明度
- 图片可浸入状态栏和导航栏
用法
- 下载配置
- Android studio用户,可在项目中的 build.gradle 文件中添加如下引用
dependencies {
compile 'android.dev.chenyk:lutosystembar:1.0.0'
}
- Eclipse,将下载下来的aar包放入libs包中,点我下载
- 方法调用
LutoSystemBar.Builder(activity)
.setStatusBarType(StatusBarType.PURECOLOR)//设置状态栏类型
.setSystemBarColor(Color.parseColor("#FF4081"))//设置系统栏整体颜色
.setSystemBarColorRes(R.color.colorPrimary)//设置系统栏整体颜色
.setStatusBarColor(Color.parseColor("#FF4081"))//设置状态栏颜色,优先级高于SystemBarColor
.setStatusBarColorRes(R.color.colorPrimary)//设置状态栏颜色,优先级高于SystemBarColor
.translucentNavigationBar()//是否半透明状态栏
.setNavigationBarColor(Color.parseColor("#FF4081"))//设置导航栏颜色,优先级高于SystemBarColor,必须调用translucentNavigationBar()方法之后才有效
.setNavigationBarColorRes(R.color.colorPrimary)//设置导航栏颜色,优先级高于SystemBarColor,必须调用translucentNavigationBar()方法之后才有效
.setSystemBarAlpha(80)//设置系统栏整体透明度
.setStatusBarAlpha(80)//设置状态栏透明度,优先级高于SystemBarAlpha
.setNavigationBarAlpha(80)//设置导航栏透明度,优先级高于SystemBarAlpha,必须调用translucentNavigationBar()方法之后才有效
.translucentForImageView(titleView)//设置图片进入状态栏时,要下移的视图
.build();//调用此方法参数配置才会生效
关键代码说明
- 针对不同Android版本将状态栏和导航栏透明
/**
* 为状态栏配置半透明效果
*/
private void translucentStatusBarConfigForNarmal() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//安卓6.0及以上
mWindow.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
mWindow.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//安卓4.4~6.0
mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
/**
* 为实现图片浸入状态栏或导航栏效果的情况,设置相关窗口配置
* 默认此情况下,状态栏颜色不可修改,如果非要修改,则需调用{@link #changeStatusColorForImageView()}开启功能
*/
private void translucentStatusBarConfigForImageview() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mWindow.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
/**
* 配置导航栏半透明效果
*/
private void translucentNavBarConfig() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//安卓6.0及以上
if (mSystemBarConfigBean.isTranslucentForImageView) {
//图片浸入导航栏时配置
mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
} else {
mWindow.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//安卓4.4~6.0
mWindow.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
}
- 针对不同Android版本修改状态栏和导航栏的颜色和透明度
自Android 6.0以后,系统提供了状态栏和导航栏的颜色设置方法,只需调用设置即可;而对于6.0以下4.4以上的系统,则需要通过绘制一个跟状态栏高度一致的矩形条才能实现效果。
/**
* 修改系统栏颜色
*
* @param statusBarColor
* @return
*/
private LutoSystemBar changeSystemBarColor(int statusBarColor) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return this;
int navigationBarColorResult = BarConversionUtil.calculateColorWithAlpha(
BarResUtil.getColor(mActivity, getNavigationBarColor()), getNavigationBarAlpha());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//安卓6.0及以上
mWindow.setStatusBarColor(statusBarColor);
mWindow.setNavigationBarColor(navigationBarColorResult);
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//安卓4.4~6.0
StatusBarView.addStatusBarView(mActivity, statusBarColor);
}
return this;
}
- 普通模式下,需要配置根布局参数
/**
* 根布局设置
*/
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
private void setRootView() {
try {
ViewGroup rootViewGroup = (ViewGroup) ((ViewGroup) mActivity.findViewById(android.R.id.content)).getChildAt(0);
rootViewGroup.setFitsSystemWindows(true);
rootViewGroup.setClipToPadding(true);
} catch (Exception e) {
e.printStackTrace();
}
}
写在最后,希望以上内容能帮到您,不定时总结和记录个人的经验。您的支持是我前进的动力,经验分享是美德
网友评论