透明状态栏(StatusBar)的全适配

透明状态栏(StatusBar)的全适配

状态栏指定android手机上顶部显示手机状态信息的位置。

透明状态栏是android 自4.4开始新加入的功能,他可以是状态栏根据我们自己想要的颜色进行定义,使titleBar能够和状态栏融为一体,增加沉浸感。

实现中遇到的阻碍

因为状态栏是在4.4加入的,所以在4.4以前的系统上无法实现。现在世面上的手机android4.4一下的占比不是很大,所以不是太影响。

网上有很多关于透明状态栏实现的技术博客,以及我之前的博客透明状态栏(沉浸式状态栏)中,实现方式为通过设置android:windowTanslucentStatusfitSystemWindows实现。

但通过属性设置的方式在使用中会出现沉浸状态不一样的现象,在5.0及以上的系统中使用透明状态栏不是完全透明的,会在透明的基础上添加一层半透明的阴影,非常的不友好。于是解决在不同系统版本之间的适配是主要问题。

解决方式

对于透明状态栏,有以下两种情况

  • 设置状态栏为一个单纯的颜色。
  • 顶部是图片时,使图片沉浸到状态栏上。

对于适配,有以下两种情况需要适配

  • 4.4系统
  • 5.0及以上系统

那么思路如下:

  • 当状态栏需要设置一个单纯的颜色时:

    • 4.4:设置android:windowTranslucateStatus属性,并且手动添加一个和状态栏高度等高的View。
    • 5.0及以上:不设置android:windowTranslucateStatus属性,直接设置statusBarColor的色值。
  • 当状态栏需要设置一个图片
    • 4.4:直接设置android:windowTranslucateStatus属性。
    • 5.0:不设置,同时设置状态栏颜色透明,并使用另一个属性。

代码实现

/**
 *
 * 状态栏的实现封装类
 *      - 完成以下两种功能:
 *          1,设置一个纯色,适配4.4并以上,需要处理5.0并以上的阴影效果
 *          2,当顶部是一个图片,上移到状态栏
 * Created by mdw on 2016/5/6.
 */
public class StatusBarUtils  {

    /**
     * 将acitivity中的activity中的状态栏设置为一个纯色
     * @param activity 需要设置的activity
     * @param color 设置的颜色(一般是titlebar的颜色)
     */
    public static void setColor(Activity activity,int color){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //5.0及以上,不设置透明状态栏,设置会有半透明阴影
            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //设置statusBar的背景色
            activity.getWindow().setStatusBarColor(color);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            // 生成一个状态栏大小的矩形
            View statusView = createStatusBarView(activity, color);
            // 添加 statusView 到布局中
            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
            decorView.addView(statusView);
            //让我们的activity_main。xml中的布局适应屏幕
            setRootView(activity);
        }
    }

    /**
     * 当顶部是图片时,是图片显示到状态栏上
     * @param activity
     */
    public static void setImage(Activity activity){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //5.0及以上,不设置透明状态栏,设置会有半透明阴影
            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //是activity_main。xml中的图片可以沉浸到状态栏上
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            //设置状态栏颜色透明。
            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
        } else {
            //。。。。
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

    /**
     * 设置根布局参数,让跟布局参数适应透明状态栏
     *
     */
    private static void setRootView(Activity activity) {
        //获取到activity_main.xml文件
        ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);

        //如果不是设置参数,会使内容显示到状态栏上
        rootView.setFitsSystemWindows(true);
    }

    /**
     * 获取状态栏的高度
     * @param acitivity
     * @return
     */
    private static int getStatusBarHeight(Activity acitivity){

        int resourceId = acitivity.getResources().getIdentifier("status_bar_height", "dimen", "android");

        return acitivity.getResources().getDimensionPixelOffset(resourceId);
    }

    /**
     * 生成一个和状态栏大小相同的矩形条
     *
     * @param activity 需要设置的activity
     * @param color    状态栏颜色值
     * @return 状态栏矩形条
     */
    private static View createStatusBarView(Activity activity, int color) {
        // 绘制一个和状态栏一样高的矩形
        View statusBarView = new View(activity);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                getStatusBarHeight(activity));
        statusBarView.setLayoutParams(params);
        statusBarView.setBackgroundColor(color);
        return statusBarView;
    }
}

注释已经很详细了,不做过多的解释。

使用

注意:StatusBarUtils中已经完全处理,使用时xml文件中不需要添加特殊处理。

  • MainActivity(设置状态栏为一个纯色)

xml文件


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
  >

    <LinearLayout
        android:background="#FFFF0000"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="50dp">
        <TextView
            android:textColor="#fff"
            android:text="StatusBar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

    <Button
        android:onClick="toImage"
        android:text="跳转图片"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

java文件


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //设置状态栏为红色
        StatusBarUtils.setColor(this, Color.RED);
    }

    public void toImage(View view){
        Intent intent = new Intent(this,ImageViewTranslucentActivity.class);
        startActivity(intent);
    }
  • ImageViewTranslucentActivity(顶部为图片)

activity_image.xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:background="#f0f"
        android:src="@mipmap/ic_launcher"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

ImageViewTranslucentActivity java文件

   @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_image);

        //设置图片沉浸
        StatusBarUtils.setImage(this);

    }

效果

  • 4.4效果

  • 5.0及以上的效果

时间: 2024-07-30 09:18:18

透明状态栏(StatusBar)的全适配的相关文章

Android UI体验之全屏沉浸式透明状态栏效果

前言: Android 4.4之后谷歌提供了沉浸式全屏体验, 在沉浸式全屏模式下, 状态栏. 虚拟按键动态隐藏, 应用可以使用完整的屏幕空间, 按照 Google 的说法, 给用户一种 身临其境 的体验.而Android 5.0之后谷歌又提出了 ColorPalette 的概念,让开发者可以自己设定系统区域的颜色,使整个 App 的颜色风格和系统的颜色风格保持统一.今天学习总结一下如何实现Android 4.4以上全屏沉浸式透明状态栏效果.先看下预期效果: 首先现分清楚哪部分是状态栏,哪部分是导

android 透明状态栏方法及其适配键盘上推(二)

在上一篇文章中介绍了一种设置透明状态栏及其适配键盘上推得方法.但是上一篇介绍的方法中有个缺点,就是不能消除掉statusbar的阴影.很多手机如(三星,Nexus都带有阴影).即使我用了: <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:elevation="

android 透明状态栏方法及其适配键盘上推(一)

android的状态栏(statusBar)版本的差异化比较大.在android 4.4 以上和5.x可以设置状态栏背景颜色,但是不可以设置状态栏中字和图标的颜色.而系统默认的statusbar的字体和图标颜色为白色.如果在6.0以下的要实现透明状态栏(也就是把整个界面延伸到statusbar),就要考虑到如果您的应用背景颜色为白色的时候,会出现statusbar里的内容都看不清楚,这一点暂时是没办法去适配的.但是6.0以上的是既能修改statusbar的背景颜色,也可以修改statusbar的

【Android】透明状态栏在App中的实现与接口设计

By Sodino 文章目录 1. 认识透明状态栏 2. 透明状态栏Api及特性 3. 设置透明状态栏 4. 处理消失的系统状态栏区域 5. fitsSystemWindows 6. Activity中的接口设计 7. Fragment中的接口设计 8. 白色Titlebar的处理 9. 小米 与 魅族 与 (莫名其妙的)华为 10. 腾讯优测UTest GitHub源码:TransparentStatusbar源码中分两个app TestBasic: 透明状态栏实现的示例,方便debug 白色

透明状态栏和沉浸式状态栏

从Android4.4开始提供的沉浸式状态栏,让APP设计得更优美,很多APP都采用了.对于沉浸式状态栏的理解,很多人都表达不太一样,在这里根据自己的理解分为透明状态栏和沉浸式状态栏,分别对4.4和5.0进行适配. 布局 1 2 3 4 5 6 7 8 9 10 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_pa

Android 透明状态栏&amp;着色状态栏

Android 5.0 及以上实现方式(android在5.0之后引入Material Design 实现方式相对简单) 透明状态栏,背景浸入状态栏 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } 在布局文件中View 默认f

android沉浸式状态栏、变色状态栏、透明状态栏、修改状态栏颜色及透明

首先我要区分清楚沉浸式状态栏与变色状态栏. 沉浸式状态栏指的是,状态栏隐藏,在手指做了相关操作后,状态栏显示出来,例如视频播放器,在播放视频时是隐藏状态栏的,但是点击屏幕的时候,状态栏会显示出来,再例如文本阅读器,在阅读的时候是全屏的,然后从屏幕上方下滑或者下方上划,虚拟键和状态栏出现了,但却是直接覆盖在程序文字上的,这是所谓的沉浸式状态栏. 那么大家平时所说的状态栏与导航栏颜色相同,或者透明,指的是变色状态栏,或者透明状态栏. 对于这两个概念的理解,大家可以参考http://www.andro

Android透明状态栏。适用于 4.4 以上及 5.0以上设备

概述 有时候我们想在 andorid 手机上实现一种 跨越 顶部状态栏的效果,比如一张图片直接显示在 状态栏内.比如下图: 这个页面里有张图片,这个图片显示在整个页面的上部分.状态栏是 漂浮在这个图片上的. 实现透明状态栏的方法 适配Android 4.4 +的方法: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window window = activity.getWindow(); // Translucent sta

Android 透明状态栏

if(VERSION.SDK_INT >= VERSION_CODES.KITKAT) {    //4.4以上                                 //透明状态栏                                 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);                                 //透明导航栏