Android 状态栏的透明效果体验

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透明化/沉浸式状态栏实践及源码分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值