先上实际效果图,有三个版本请注意区分 API 版本
API>=20 | API=19 | API<19 |
---|---|---|
以上的效果我们称之为对状态栏的着色,而非沉浸式状态栏,那是另外的东西。
想要实现以上的效果并不难,阅读本文了解原理后,就会觉得想要以上的效果真的很简单。
本文旨在总结我的理解告诉读者一步步实现状态栏着色的原理。
对状态栏的控制一切基础都源于
- static public void setTranslucentWindows(Activity activity) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
- //透明状态栏
- activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
- }
- }
请注意该 Flag 标识的 API 版本为 19,也就是只能在 API>=19 以上实现透明状态栏,这就是上文效果图用 API 区分的原因。
设置透明状态栏之后,内容会顶到屏幕顶部会和状态栏中的内容重叠。
就需要设置 padding 出和状态栏相同的高度,防止重叠
有两种解决方法:
(API+14)系统布局时自动找到最外层的 View 设置 paddingTop
- android:fitsSystemWindows="true"
- /**
- * 19API以上 读取到状态栏高度才有意义
- *
- * @param context
- * @return
- */
- static public int getStatusBarHeight(Context context) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
- int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
- return resourceId > 0 ? context.getResources().getDimensionPixelSize(resourceId) : 0;
- } else {
- return 0;
- }
- }
这里先说明前两步的结果;
所以就需要我们对第二步中产生的预留空间设置颜色,同样有两种方法:
- /**
- * 设置状态栏颜色为App主色
- * #setTranslucentWindows(Activity)}方法使用
- * 主要方法为添加一个View并设置背景色添加到系统contentView中
- *
- * @param activity
- */
- static public void addStatusBarBackground(Activity activity) {
- int height;
- height = getStatusBarHeight(activity);
- if (height <= 0) {
- return;
- }
- FrameLayout layout = (FrameLayout) activity.findViewById(android.R.id.content);
- FrameLayout statusLayout = new FrameLayout(activity);
- statusLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height));
- TypedValue typedValue = new TypedValue();
- TypedArray a = activity.obtainStyledAttributes(typedValue.data, new int[] {
- R.attr.colorPrimary
- });
- int color = a.getColor(0, 0);
- a.recycle();
- statusLayout.setBackgroundColor(color);
- layout.addView(statusLayout);
- }
- 当API21+:能够调用系统API直接对状态栏着色
- if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){
- this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
- this.getWindow().setStatusBarColor(ContextCompat.getColor(this,R.color.red_normal));
- }
实现状态栏着色并不复杂,只需要三步,真正使用时其实就是几行代码或者几个方法调用。但是在实际使用中需要考虑实际需求,兼容问题。搭配使用每一步的使用就能实现我们想要的效果。
如上文的效果图实现就是:Activity 状态栏透明,导航搜索栏 View 背景色透明 paddingTop 状态栏高度,覆盖在图片之上,而图片没有任何控制。
来源: http://www.bubuko.com/infodetail-1978990.html