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

关于沉浸式状态栏和透明化系统栏的官方说明

  • Immersive full-screen mode

To provide your app with a layout that fills the entire(全部的) screen,the new SYSTEM_UI_FLAG_IMMERSIVE flag for setSystemUIVisivility()(when combined(结合) with SYSTEM_UI_FLAG_HIDE_NAVIGATION enables a new immersivefull-screen mode.while immersive full-screen mode is enable, your activity continues to receive all touch events, The user can reveal(展现,披露) the system bars with an inward(向内的) swipe(挥击) along the region where the system bars normally appear. This clears the SYSTEM_UI_FIAG_HIDE_NAVIGATION flag (and the SYSTEM_UI_FIAG_FULL_SCREEN flag, if applied) so the system bars remain visiable. However, if you'd like the system bars to hide again after a few moments, you can instead use the SYSTEM_UI_FIAG_IMMERSIVE_STICKY flag.

  • Translucent(透明化) system bars

You can now make the system bars partially translucent with the themes,
Theme.Holo.NoActionBar.TranslucentDecor and Theme.Holo.NoActionBar.TranslucentDecor. By enabling translucent system bars, your layout will fill the area behind the system bars, so you must also enable fitsSystemWindows for the portion(部分) of your layout that should not be covered by the system bars.
If you're creating a custom theme, set one of these themes as the parent theme or include the windowTranslucentNavigation and windowTranslucentStatus style properties in your theme.

关于透明状态栏说明:透明状态栏就是状态栏的颜色和activity根布局颜色相同

  • 和图片颜色相同的透明状态栏
  • 和根布局颜色相同的透明状态栏

颜色方式

colorMethod

在 android studio 中,排列方式变成 project,然后生成 values-v19 文件夹和 values-v21 文件夹,在文件夹中新建 style.xml 文件,接着分别在不同的 style 中生成 theme


styles.jpg

values-v19/style.xml

<Style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavagation">true</item>
    <item name="android:fitsSystemWindows">true</item>
</style>

values-v21/style.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
    <item name="android:statusBarColor">#31c27c</item>
    <item name="android:fitsSystemWindows">true</item>
</style>

将 activity 的 theme 设置为 AppTheme

这个生成 Toast 会产生位移,可以使用 Toast.makeText(getApplicationContext(), "toast", Toast.LENGTH_SHORT).show();

图片方式

pictureMethod

values-v19/style.xml

<Style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavagation">true</item>
    <item name="android:fitsSystemWindows">true</item>
</style>

values-v21/style.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:fitsSystemWindows">true</item>
</style>

其实图片方法和颜色方法殊途同归,可以直接使用相同的 <item name="android:statusBarColor">@android:color/transparent</item>来使用

除了在 values-v19 和 values-v21 的 style.xml 中使用 fitsSystemWindows 属性,还可以直接在根部局中加上 android:fitsSystemWindows="true" 属性,这个方法就没有 toast 位移的问题,但是需要在每一个activity的根布局中加入这个属性,比较麻烦,我们还可以使用以下方法来解决重复书写 fitsSystemWindows:

  • 新建一个TranslucentBarBaseActivity

      public abstract class TranslucentBarBaseActivity extends AppCompatActivity {
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
    
      setContentView(getLayoutResId());//把设置布局文件的操作交给继承的子类
    
      ViewGroup contentFrameLayout = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT);
      View parentView = contentFrameLayout.getChildAt(0);
      if (parentView != null && Build.VERSION.SDK_INT >= 14) {
          parentView.setFitsSystemWindows(true);
      }
      }
    
          /**
          * 返回当前Activity布局文件的id
          *
          *@return
          */
          abstract protected int getLayoutResId();
      }
    

    然后主 activiy 继承此 activiy,就可以了。

以上文档引用自 Android开发:Translucent System Bar 的最佳实践

TranslucentBarDemo 中可以看到代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 关于沉浸式状态栏一词的说法从何而来我们无从考证。但这确实是个错误的说法先引用官方的一段话。 Immersive f...
    ifjgm阅读 9,297评论 3 46
  • 概述 在一个人云亦云的时代,在技术迅猛发展的时代,我们来不及去好好学习,好好理解,就这样和着别人说话,都没有好好思...
    Lshare_Blog阅读 15,172评论 13 41
  • 前言 首先请大家看几张图: 以上的效果,一般我们统称为沉浸式状态栏。其实,这种叫法不是很准确,而且也没有沉浸式状态...
    宇是我阅读 4,007评论 2 28
  • 一提到沉浸式状态栏,第一个浮现在脑海里的词就是“碎片化”。碎片化是让 Android 开发者很头疼的问题,相信没有...
    扬州慢_阅读 176,358评论 30 300
  • 生命中的痛,大多都无法言说。 有时候并不是不能说,而是不愿说。 不愿自己变成一只摇尾乞怜的狗。 从未如此强烈感受到...
    茶小星阅读 3,614评论 0 1