Android 状态栏的透明效果体验
现在,越来越多的Android APP采用了透明的状态栏的效果来让自己的APP在效果上接近IOS系统自带的“沉浸式“顶栏体验。目前这种实现方式的叫法,国内普遍称之为:沉浸式状态栏。但是,我通过在网络查询大量相关资料表明:此处的沉浸式状态栏
其实就是指透明状态栏。
关于真正意义上的沉浸式状态栏的详细情况,请参考我的另一篇博客Android APP的沉浸式体验。
- 透明状态栏1:这种样式其实就是把状态栏和标题栏配置成一种颜色,达到一种美观效果!
- 透明状态栏2:这个效果其实就是让背景图片可以利用系统状态栏的空间,从而能够让背景图和状态栏融为一体。
Translucent Bars
Google 在 Android 4.4 的 API 描述页面里提到了“Translucent system UI styling”,即半透明化的系统UI风格。这个“半透明化”包括了状态栏和通知栏,当开发者让应用支持这个新特性的时候,状态栏和导航栏可以单独/同时变为渐变的半透明样式。
在手机中,系统状态栏承担着相当重要的功能,比方说时间显示,信号强度,电池电量等等,这些信息在Android 4.4版本以下,都是黑底白字,是由系统直接定死的无法修改,如下图所示:
但是Google官方在Android 4.4引入透明状态栏Translucent Bars,又在Android 5.0提出Material Design,让下图中APP显示的效果成为可能,两者对比后我们很容易发现使用了“透明状态栏”效果的APP,其用户体验更佳。
4.4与5.x及以上的状态栏显示差异
虽然在Android 4.4之后,系统状态栏的配置可以由开发者控制,但是在4.4版本和5.x(或更高的版本)状态栏的显示上还是有差异的(可以通过第三方库Android System Bar Tint,消除差异,但此库在Github上已被标记为废弃),更何况国内手机厂商多有定制,情况复杂,因此需要对不同的厂商做相应的适配,下文仅从原生Android系统的状态栏实现透明效果。
4.4透明状态栏效果
- Activity的主题,选择
xx.NoActionBar
相关的主题
在res目录下,创建API19的目录values-v19,之后Android 4.4的设备的主题会自动引用这里的,而非res/values目录下的styles.xml
- 设置状态栏透明
1.第一种方法(常用):
通过在主题中设置属性:android:windowTranslucentStatus
即可
2.第二种方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
super.onCreate(savedInstanceState);
}
- 防止状态栏和Toolbar重合
1.第一种方法(常用):
在Toolbar的根父布局
中添加属性android:fitsSystemWindows="true"
即可
android:fitsSystemWindows这个属性,主要是通过调整当前设置这个属性的view的padding去为我们的status_bar留下空间。如果你不写,那么状态栏和Toolbar就会有挤一块的感觉了,类似会这样:
2.第二种方法:必须设置toolbar的height=wrap_content
(1)直接给Toobar设置paddingTop等于状态栏高
通过下面的方法获取到status bar
的高度
public static int getStatusBarHeight(Context context) {
//TODO: 算取状态栏的高
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
设置Toolbar的高度为status bar
的高度
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drawer);
// Retrieve the AppCompact Toolbar
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Set the padding to match the Status Bar height
toolbar.setPadding(0, getStatusBarHeight(), 0, 0);
}
(2)在Toolbar的上方添加一个和状态栏高度一样的Veiw,并将这个View的背景色设置成和Toolbar的背景色一样
生成一个状态栏大小的矩形View
private static View createStatusView(Activity activity, int color) {
// 获得状态栏高度
int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
int statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId);
// 绘制一个和状态栏一样高的矩形
View statusView = new View(activity);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
statusBarHeight);
statusView.setLayoutParams(params);
statusView.setBackgroundColor(color);
return statusView;
}
DecorView把矩形View
设置到status bar
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// 设置状态栏透明
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// 生成一个状态栏大小的矩形View
View statusView = createStatusView(activity, color);
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
decorView.addView(statusView);
// 设置根布局的参数
ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
rootView.setFitsSystemWindows(true);
rootView.setClipToPadding(true);
}
最终运行在4.4.4设备上的结果如下图所示:
5.x及以上透明状态栏效果
因为,5.0采用了MD风格,设置系统状态栏的颜色直接可以在Activity的Theme中通过属性定义,MD规定的颜色属性控制如下:
从上图可以看出,我们只有设置属性colorPrimaryDark
即可设置状态栏的颜色。
最终运行在5.1设备上的结果如下图所示:
【参考博客】:
1.Android状态栏微技巧,带你真正理解沉浸式模式
2.Android 沉浸式状态栏攻略 让你的状态栏变色吧
3.Using Immersive Full-Screen Mode
4.Android and the transparent status bar
5.沉浸式状态栏和透明状态栏
6.Android透明化/沉浸式状态栏实践及源码分析