statusbar_statusbar控件 - CSDN
精华内容
参与话题
  • StatusBar用法

    2019-07-20 07:33:29
    一、StatusBar组件介绍 StatusBar 是 React Native 0.20 起新增的跨平台组件,它可以用来设置并动态改变设备的状态栏显示特性。 StatusBar 组件可以同时加载多个 StatusBar 组件,这些 StatusBar 组件的属性可以按照...

    一、StatusBar组件介绍

    StatusBar 是 React Native 0.20 起新增的跨平台组件,它可以用来设置并动态改变设备的状态栏显示特性。
    StatusBar 组件可以同时加载多个 StatusBar 组件,这些 StatusBar 组件的属性可以按照加载的顺序进行合并。一种常见的用法就是:我们可以在使用 Navitator 的时候,针对不同的路由页面设置特殊的状态栏样式。
    虽然 StatusBar 是跨平台组件,但其中有些属性是通用的,而有些则是 iOS 或 Android 独有的。所以我们开发时要做好适配。

    二、通用属性介绍
    1.animated

    设置当状态栏的状态发生变化时,是否需要加入动画。
    动画支持 backgroundColor、barStyle 和 hidden 属性的变化。

    2.hidden
    设置状态栏是否隐藏。
    三、仅支持iOS的属性
    1.barStyle
    用于设置状态栏文字的颜色,其值是枚举类型:
    default:黑色文字(默认)
    light-content:白色文字

    2.networkActivityIndicatorVisible
    设定网络活动指示器(就是那个菊花)是否显示在状态栏。

    3.showHideTransition
    通过 hidden 属性来显示或隐藏状态栏时所使用的动画效果,有两种选择:fade(默认值)、slide
    四、仅支持Android的属性
    1.backgroundColor
    Android 设备上状态栏的背景颜色

    2.translucent
    设置状态栏是否为透明。
    当状态栏的值为 true 的时候,应用将会在状态栏下面进行绘制显示。这样在 Android 平台上面就是沉浸式的效果,可以达到 Android 和 iOS 应用显示效果的一致性。
    该值常常同配置半透明效果的状态栏颜色一起使用。

    3.StatusBar.currentHeight
    React Native 在 Android 平台为 StatusBar 组件提供了一个静态常量 currentHeight,我们可以通过读取这个常量来得到 Android 手机状态栏的高度。
    注意:currentHeight 不是一个属性,我们直接访问 StatusBar.currentHeight 就可以了。
    五、不同平台下状态栏的处理
    1、Android 手机状态栏

    当状态栏呈现在 Andorid 手机屏幕顶部时,它会占用顶部这个空间,我们只能使用剩下的屏幕空间。也就是说如果从第 0 行开始放置组件时,组件会紧贴着状态栏的下边沿显示。
    要想知道实际可用的屏幕高度,可以通过手机屏幕的高度减去状态栏高度得到。

    2、iOS 手机状态栏

    在 iOS 平台上,取得的屏幕高度就是实际可使用的高度。
    如果从第 0 行开始排列组件时,组件会紧贴着手机屏幕的最上沿显示。如果状态栏没有被隐藏,它将覆盖在第 0 行组件的上方。
    如果不想设置状态栏隐藏,则应当空出状态栏的显示区域。但可以为这个区域设置背景色,以使整个界面风格统一。

    本文转自https://www.jianshu.com/p/cff86e199c93

    转载于:https://www.cnblogs.com/smart-girl/p/10879485.html

    展开全文
  • QT状态栏(statusbar)用法

    万次阅读 2017-03-31 14:36:49
    状态栏显示的信息分3种 1. 一般信息,用QLabel 代表 2. 永久信息,文本会一直显示在状态栏的最右边。 3. 临时信息,指定信息现实的时间。时间到即信息消失 ...locationLabel->setAlignment(Qt::Ali

    状态栏显示的信息分3种
    1. 一般信息,用QLabel 代表
    2.  永久信息,文本会一直显示在状态栏的最右边。

    3. 临时信息,指定信息现实的时间。时间到即信息消失


    //QLabel *locationLabel;

    locationLabel = new QLabel("July");

    locationLabel->setAlignment(Qt::AlignCenter);

    locationLabel->setMinimumSize(locationLabel->sizeHint());

     

    //QLabel *aixLabel;

    aixLabel = new QLabel("\"CTRL + H\" for help");

     

    //Optional

    statusBar()->setStyleSheet(QString("QStatusBar::item{border: 0px}")); // 设置不显示label的边框

    statusBar()->setSizeGripEnabled(false); //设置是否显示右边的大小控制点

    statusBar()->addWidget(locationLabel);

    statusBar()->addWidget(aixLabel, 1);

     

    QLabel *per1 = new QLabel("Ready1", this);

    QLabel *per2 = new QLabel("Ready2", this);

    QLabel *per3 = new QLabel("Ready3", this);

    statusBar()->addPermanentWidget(per1); //现实永久信息

    statusBar()->addPermanentWidget(per2);

    statusBar()->insertPermanentWidget(2, per3);

     

    statusBar()->showMessage("Status is here...", 3000); // 显示临时信息,时间3秒钟.

    展开全文
  • 终于搞懂令人迷惑的 StatusBar

    万次阅读 2017-10-20 14:09:32
    随着Android版本的迭代,开发者对状态栏等控件有了更多的控制, google 一直在尝试引入新的Api来满足开发者的需求,但Api却一直不够完美,接口添加了很多,却都不够简单...当前主流(2017)Android app StatusBar

    转自 http://www.jianshu.com/p/c8221fb6b4fc

    随着Android版本的迭代,开发者对状态栏等控件有了更多的控制, google 一直在尝试引入新的Api来满足开发者的需求,但Api却一直不够完美,接口添加了很多,却都不够简单或者说完美,算上第三方厂商的特色行为,怎一个“乱”字了得。

    1、效果

    当前主流(2017)Android app StatusBar 效果有以下几种:

    简单分个类:

    • Material Design 风格,状态栏颜色比 toolbar 颜色略深。google 全家桶主要采用这个方式。
    • 与 DrawerLayout 结合使用,抽屉划出后,状态栏添加一个半透明蒙层,抽屉位于蒙层和原状态栏之间。 google 全家桶采用。
    • 与 toolbar 同色,大部分国内 app 使用。
    • 大黑边 国内少部分 app,5.0以下大部分app都是这个效果。
    • 隐藏状态栏,导航栏,滑动时出现。欢迎,登录,全屏视频播放等界面使用。
    • 渐变效果,少部分app使用
    • 状态栏字体默认为白色,部分 app 修改为黑色
    • 图片延伸到状态栏

    2、相关API

    与状态栏相关的 Api 主要有以下几个:

    2.1、远古时期 API1

    // 全屏布局且隐藏状态栏:
    //4.4 上,顶部下滑,出现半透明状态栏,过一会儿状态栏消失
    //4.1 上,顶部下滑,没反应
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
    // 全屏布局,不隐藏状态栏(可能已失效):
    //实测 Support libaray 26.1.0 下(使用 support 库中的主题和 AppCompatActivity),未见状态栏。
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 
    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    

    2.2、Android3.0

    在Android3.0中,View添加了一个重要的方法:View.setSystemUiVisibility(int),用于控制一些窗口装饰元素的显示,并添加了

    • View.STATUS_BAR_VISIBLE
    • View.STATUS_BAR_HIDDEN :实测statusbar不会消失,仅隐藏statusbar 部分内容

    两个Flag用于控制Status Bar的显示与隐藏。

    一般是这么用的

     View decorView = getWindow().getDecorView();
     int uiOptions =  View.STATUS_BAR_VISIBLE;
     decorView.setSystemUiVisibility(uiOptions);
    

    2.3、Android4.0

    • View.STATUS_BAR_VISIBLE 改为 View.SYSTEM_UI_FLAG_VISIBLE,
    • View.STATUS_BAR_HIDDEN 更名为 View.SYSTEM_UI_FLAG_LOW_PROFILE,该 flag 同时影响 StatusBar 和 NavigationBar ,但并不会使得 SystemUI 消失,而只会使得背景很浅,并且去掉 SystemUI 的一些图标或文字。
    • 添加了一个flag:SYSTEM_UI_FLAG_HIDE_NAVIGATION,会隐藏NavigationBar,但是由于NavigationBar是非常重要的,因此只要有用户交互(例如点击一个 button),系统就会清除这个flag使NavigationBar就会再次出现。

    2.4、Android4.1

    • View.SYSTEM_UI_FLAG_FULLSCREEN: 这个标志与WindowManager.LayoutParams.FLAG_FULLSCREEN作用相同(全屏布局且隐藏状态栏)
      • 4.1 上顶部下滑没反应
      • 4.4 上顶部下滑从新出现状态栏,且挤压 Activity 的布局。
    • View.SYSTEM_UI_FLAG_LAYOUT_STABLE: 与其它flag配合使用,防止系统栏隐藏时内容区域发生变化。
    • View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN: Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住
    • View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION: 使内容布局到NavigationBar之下。

    2.5、Android 4.4

    • View.SYSTEM_UI_FLAG_IMMERSIVE
    • View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY

    View.SYSTEM_UI_FLAG_IMMERSIVE 和 SYSTEM_UI_FLAG_HIDE_NAVIGATION 搭配使用,使用 SYSTEM_UI_FLAG_HIDE_NAVIGATION 后,导航栏消失,当用户交互时(例如点击一个 button),导航栏又会出现,添加 View.SYSTEM_UI_FLAG_IMMERSIVE 后,交互时导航栏不会出现,但是会底部滑动导航栏仍会出现。

    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 和 View.SYSTEM_UI_FLAG_FULLSCREEN 配合使用:状态栏半透明,顶部向下滑动出现,过一段时间消失。

    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 和 SYSTEM_UI_FLAG_HIDE_NAVIGATION 配合使用:导航栏半透明,交互时,导航栏不出现,底部向上滑动出现,过一段时间消失。

    • FLAG_TRANSLUCENT_STATUS

      当使用这个flag时SYSTEM_UI_FLAG_LAYOUT_STABLE和SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN会被自动添加,同时,设置FLAG_TRANSLUCENT_STATUS也会影响到StatusBar的背景色,但并没有固定的表现:

      • 对于7.0以上的机型,设置此flage会使得StatusBar半透明
      • 对于6.0以上的机型,设置此flage会使得StatusBar完全透明
      • 对于5.x的机型,大部分是使背景色半透明,小米和魅族以及其它少数机型会全透明
      • 对于4.4的机型,小米和魅族是透明色,而其它系统上就只是黑色到透明色的渐变。

      google 你到底要闹哪样?

    • FLAG_TRANSLUCENT_NAVIGATION

    当使用这这个个flag时SYSTEM_UI_FLAG_LAYOUT_STABLE和SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION会被自动添加。同时,设置FLAG_TRANSLUCENT_STATUS也会影响到 NavigationBar 的背景色,效果与 FLAG_TRANSLUCENT_STATUS 相同

    2.6、Android 5.0

    • 主题里通过colorPrimaryDark来指定 StatusBar 背景色
    • 可以调用 window.setStatusBarColor(@ColorInt int color) 来修改状态栏颜色,但是让这个方法生效有一个前提条件:你必须给window添加FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS并且取消FLAG_TRANSLUCENT_STATUS

    2.7、Android 6.0

    在Android6以后,我们只要给SystemUI加上SYSTEM_UI_FLAG_LIGHT_STATUS_BAR这个flag,就可以让字体和图标变为黑色。

    2.8、fitSystemWindows

    在布局内容延伸到状态栏和导航栏时,我们可以给 View 设置 fitSystemWindows 属性,它是一个 boolean 值,可以在xml里直接设置android:fitsSystemWindows="true",也可以通过View#setFitsSystemWindows(boolean fitSystemWindows)在java代码中设置。设置后,空调会调整自己的 padding 用于避开系统控件。

    工作原理:
    Android系统组件例如状态栏、NavBar、键盘所占据的空间称为界面的WindowInsets,Android系统会在特定的时机从根View派发WindowInsets(深度优先)。一旦有一个View 的 fitSystemWindows 设置为 true,它就会根据WindowInsets来调整自己的 padding,并消耗WindowInsets,不在向下分发 WindowInsets,那么WindowInsets的派发过程就结束了。

    需要注意的是:

    • fitSystemWindows 设置为 true,会让View原本的padding失效。
    • 可以覆写 View 的 onApplyWindowInsets(WindowInsets insets) 方法来自己处理 WindowInsets。
    • dispatchApplyWindowInsets 方法可以继续传递 WindowInsets.

    3、实现

    3.1、Material Design 风格

    采用这个效果的应用主要是 Material Design 设计风格的 App,表现形式为:

    • Android 5.0+,状态栏颜色略深与 toolbar,颜色值可以来这里
    • Android 5.0以下,状态栏变现为大黑边

    实现这样的风格很简单:

    • 如果状态栏颜色不变,可以直接在主题(5.0 style)中定义:
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <!-- 默认使用 colorPrimaryDark 做状态栏颜色 -->
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
            
             <!-- 如果使用了下面两个属性,状态栏颜色变为android:statusBarColor,colorPrimaryDark 被覆盖 -->
            <item name="android:windowDrawsSystemBarBackgrounds">true</item>
            <item name="android:statusBarColor">@android:color/transparent</item>
        </style>
    </resources>
    

    需要注意的是:

    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    

    <item name="android:windowTranslucentStatus">true</item>
    

    不能同时设置为 true,否则设置的颜色失效。

    • 如果状态栏颜色在运行过程中需要变化:
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(color); 
    }
    

    3.2、Toolbar 同色

    效果和 Material Design 风格类似,设置方法和Material Design 风格相同。

    3.3、侧边栏

    效果:

    • 5.0+:抽屉划出后,状态栏添加一个半透明蒙层,抽屉位于蒙层和原状态栏之间。
    • 5.0-:状态栏为大黑边,不参与交互。

    曾经,想做个 material design 风格的侧边栏效果,那是相当的复杂,可以看看这篇文章,现在(support 库最新版本 26.1.0),给 DrawerLayout 设置 fitSystemWindows 为 true,系统就帮你把所有的事办好了,当然包括了老版本的兼容(google 大法好)。

    3.4、渐变效果

    效果:
    5.0+:渐变
    5.0-:大黑边

    实现:

    • 状态栏设置为透明:

    v21 的style

    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
    

    或者

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        getWindow().setStatusBarColor(getResources().getColor(android.R.color.transparent));
    }
    
    • 设置从状态栏开始布局
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);
     }
    
    • 修改布局

    不同版本设置不同的布局(代码,xml 均可)
    5.0+:在布局顶部加上有渐变效果背景的 View,渐变效果可以使用 shape 实现。
    5.0-:正常布局。

    3.5、隐藏状态栏,导航栏,滑动时出现

    欢迎,登录,全屏视频播放等界面可能会使用这样的效果。

    常见的效果有:

    视频全屏播放:

    • 4.4+:全屏布局,状态栏,导航栏消失,一般交互时不出现,滑动顶部或底部时出现,过一段时间消失。
    getWindow().getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    
    • 4.0+:这个版本就不要指望隐藏导航栏了(这个版本一交互,导航栏必然要出现),状态栏消失,顶部滑动导航栏不出现。
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    

    全屏欢迎页面:

    • 4.4+:全屏布局,状态栏,导航栏消失,一般交互时不出现,滑动顶部或底部时出现且状态栏导航栏均为半透明,过一段时间消失。
    getWindow().getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    
    • 4.0+:导航栏,状态栏消失。欢迎页没有交互,导航栏不会因为交互出现。
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
    

    类似qq的登录页面

    • 4.4+:全屏布局,状态栏消失,滑动顶部时出现,过一段时间消失。
    getWindow().getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    
    • 4.0+:状态栏消失,顶部滑动导航栏不出现。
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    

    3.6、状态栏字体修改为黑色

    一般这么干的都是将状态栏设计为浅色的。因为仅 6.0+ 和 小米 魅族支持修改状态栏颜色。5.0 版本会因为浅色状态栏看不清状态栏信息。最好还是让设计改设计稿吧!非要这么做的话,就只有为 5.0 单独设计了,适配 5.0-, 5.0+, 6.0+,这酸爽。

    3.7、图片延伸到状态栏

    同渐变效果,仅最后一步将添加渐变 view 改为 添加 ImageView 即可。

    注意

    github 有一些很火热的库,使用了 FLAG_TRANSLUCENT_STATUS 特性,将状态栏适配到了 4.4,上文已指出 FLAG_TRANSLUCENT_STATUS 在不同平台显示效果存在差异,不能保证较为一致的视觉效果,所以状态栏要玩出花样最合适的版本是 5.0+, 5.0- 统一大黑边就可以了。

    参考资料



    作者:runningzou
    链接:http://www.jianshu.com/p/c8221fb6b4fc
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    展开全文
  • 沉浸式状态栏StatusBar

    千次阅读 2018-07-10 09:43:00
    这篇文章更多是一个总结别人的学习成果,如有冒犯请联系本人立即删除。使用了文章内容的链接如下:Android 沉浸式状态栏攻略 让你的状态栏变色吧(鸿洋)Android状态栏微技巧,带你真正理解沉浸式模式(郭霖)Android ...

    这篇文章更多是一个总结别人的学习成果,如有冒犯请联系本人立即删除。

    使用了文章内容的链接如下:
    Android 沉浸式状态栏攻略 让你的状态栏变色吧(鸿洋)
    Android状态栏微技巧,带你真正理解沉浸式模式(郭霖)
    Android App 沉浸式状态栏解决方案
    Android踩坑记之沉浸式StatusBar
    Anroid沉浸式状态栏
    android全屏/沉浸式状态栏下,各种键盘挡住输入框解决办法(郭霖推荐文章)

    1、至于为什么叫沉浸式状态栏可以看这里 为什么在国内会有很多用户把「透明栏」(Translucent Bars)称作 「沉浸式顶栏」?(我发觉基本上每篇说statusbar都会有我自己也传送了;哈哈)
    2、沉浸式状态栏仅适用于 4.4以上系统;而4.4至5.0 到 5.0以上这里又分情况

    安卓系统上的系统元素

    Paste_Image.png

    将状态栏和ActionBar隐藏

    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            View decorView = getWindow().getDecorView();
            int option = View.SYSTEM_UI_FLAG_FULLSCREEN;
            //设置系统UI元素的可见性。其中,SYSTEM_UI_FLAG_FULLSCREEN表示全屏的意思,也就是会将状态栏隐藏。
            decorView.setSystemUiVisibility(option);
            ActionBar actionBar = getSupportActionBar();
            if(actionBar != null){
                    //将actionBar隐藏
                    actionBar.hide();
            }
        }
    }
    

    上面代码效果如下图:

    Paste_Image.png

    将状态栏透明

    //5.0及以上系统才支持
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
                View decorView = getWindow().getDecorView();
    //两个Flag必须要结合在一起使用,表示会让应用的主体内容占用系统状态栏的空间
        int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
        decorView.setSystemUiVisibility(option);
    //将状态栏设置成透明色
        getWindow().setStatusBarColor(Color.TRANSPARENT);
    }
    ActionBar actionBar = getSupportActionBar();
            if(actionBar != null){
                    //将actionBar隐藏
                    actionBar.hide();
            }
    

    效果:

    Paste_Image.png

    这里有个问题就是我们的应用如果有标题栏(或toolbar);标题栏就会被系统的状态栏遮盖着一部分。

    如下图:

    Paste_Image.png

    标题栏一部分与状态栏重叠了。解决方法其实就是:

    fitsSystemWindows="true"

    给 ContentView 的下的ViewGroup设置使其为系统 View 预留空间.

    setFitsSystemWindows属性

    void setFitsSystemWindows (boolean fitSystemWindows)
    Sets whether or not this view should account for system screen decorations such as the status bar and inset its content; that is, controlling whether the default implementation of fitSystemWindows(Rect) will be executed. See that method for more details.

    Note that if you are providing your own implementation of fitSystemWindows(Rect), then there is no need to set this flag to true -- your implementation will be overriding the default implementation that checks this flag.

    大概意思是:setFitsSystemWindows用来设置影响系统的工具栏如状态栏,决定了这个view是否插入到它的ContentView。当您设置了fitSystemWindows(Rect)而没有将setFitsSystemWindows设置为true,你对fitSystemWindows(Rect)设置是无效的.
    该属性可以设置是否为系统 View 预留出空间,当设置为 true 时,会预留出状态栏的空间。

    另外一种方式设置透明状态栏

     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
                //需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                //状态栏透明颜色
                activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
            }
    //为了设置全屏
    ViewGroup mContentView = (ViewGroup) activity.findViewById(android.R.id.content);
    View mChildView = mContentView.getChildAt(0);
    if (mChildView != null) {
        //注意不是设置 ContentView 的 FitsSystemWindows, 而是设置 ContentView 的第一个子 View . 使其不为系统 View 预留空间.
        ViewCompat.setFitsSystemWindows(mChildView, true);
    }
    
    

    注意最后那行代码:

    ViewCompat.setFitsSystemWindows(mChildView, true);

    这里等同刚刚说的 setFitsSystemWindows(true);,只不过上面的作向下兼容。

    true 时,会预留出状态栏的空间。切记!切记!切记!

    其实如果你的布局是整个图片的话就不需要true了。false也可以,true主要系为了那些有标题栏的布局。防止状态栏与标题栏部分重叠。

    贴贴鸿祥大神写的提示

    Paste_Image.png

    如果我们的布局背景颜色是白色,可以这样解决

    View decorView = getWindow().getDecorView();
             //重点:SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 
            int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | 
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; 
            decorView.setSystemUiVisibility(option); 
            getWindow().setStatusBarColor(Color.TRANSPARENT);
    
    Paste_Image.png

    最后总结几点

    • 对于是图片作为背景的全屏模式,且没有标题栏的情况下。不需要设置setFitsSystemWindows这个属性。
    • 图片作为背景的全屏模式,且有标题栏的情况下。setFitsSystemWindows(false);意思是不给状态栏预留空间。
      和setClipToPadding(true);意思是可以通过padding绘制其他view
    • 非图片为背景,且有标题栏的情况下。setFitsSystemWindows(true);

    以上都是基于5.0以上如何使状态栏透明效果。

    4.4至5.0之间解决

    其实就是通过添加一个同状态栏高度的view,再设置状态栏背景颜色解决

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
                //5.0 - 4.4之间
                //设置状态栏透明属性
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                ViewGroup decorView = (ViewGroup)activity.getWindow().getDecorView();
                int count = decorView.getChildCount();
                //生成一个状态栏大小的矩形,且添加到布局中
                if(count > 0 && decorView.getChildAt(count - 1) instanceof StatusBarView){
                    //看decorView最后一个是否是StatusBarView
                    decorView.getChildAt(count - 1).setBackgroundColor(color);
                } else {
                    StatusBarView statusBarView = createStatusBarView(activity,color,statusBarAlpha);
                    //将statusBarView添加到decorView最后;由于decorView是FrameLayout,所以statusBarView放在最顶部
                    decorView.addView(statusBarView);
                }
            }
    
    /**
         * 生成一个和状态栏大小相同的半透明矩形条
         * @param activity 需要设置的activity
         * @param color    状态栏颜色值
         * @param alpha    透明值
         * @return 状态栏矩形条
         */
    private static StatusBarView createStatusBarView(Activity activity,@ColorInt int color,int alpha){
            //绘制一个和状态栏一样高的矩形 StatusBarView 本质上就是一个View而已;什么属性也没有
            StatusBarView statusBarView = new StatusBarView(activity);
            //宽是MATCH_PARENT,高度就是状态栏的高度
            LinearLayout.LayoutParams params =
                    new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getStatusBarHeight(activity));
            statusBarView.setLayoutParams(params);
            statusBarView.setBackgroundColor(color);
            return statusBarView;
        }
    

    编辑状态时,状态栏问题:

    当用到沉浸式状态栏时,如果界面有编辑栏的时候:
    郭霖推荐的博文帮到你

    我这里截取方法五的重要部分:

    Paste_Image.png
    Paste_Image.png
    Paste_Image.png

    实现步骤:

    1、把SoftHideKeyBoardUtil类复制到项目中;
    2、在需要使用的Activity的onCreate方法中添加:SoftHideKeyBoardUtil.assistActivity(this);即可。

    /**
     * 解决键盘档住输入框
     * Created by SmileXie on 2017/4/3.
     */
    
    public class SoftHideKeyBoardUtil {
        public static void assistActivity (Activity activity) {
            new SoftHideKeyBoardUtil(activity);
        }
        private View mChildOfContent;
        private int usableHeightPrevious;
        private FrameLayout.LayoutParams frameLayoutParams;
        //为适应华为小米等手机键盘上方出现黑条或不适配
        private int contentHeight;//获取setContentView本来view的高度
        private boolean isfirst = true;//只用获取一次
        private  int statusBarHeight;//状态栏高度
        private SoftHideKeyBoardUtil(Activity activity) {
       //1、找到Activity的最外层布局控件,它其实是一个DecorView,它所用的控件就是FrameLayout
            FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
            //2、获取到setContentView放进去的View
            mChildOfContent = content.getChildAt(0);
            //3、给Activity的xml布局设置View树监听,当布局有变化,如键盘弹出或收起时,都会回调此监听  
              mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            //4、软键盘弹起会使GlobalLayout发生变化
                public void onGlobalLayout() {
                if (isfirst) {
                        contentHeight = mChildOfContent.getHeight();//兼容华为等机型
                        isfirst = false;
                    }
                    //5、当前布局发生变化时,对Activity的xml布局进行重绘
                    possiblyResizeChildOfContent();
                }
            });
            //6、获取到Activity的xml布局的放置参数
            frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
        }
    
        // 获取界面可用高度,如果软键盘弹起后,Activity的xml布局可用高度需要减去键盘高度  
        private void possiblyResizeChildOfContent() {
            //1、获取当前界面可用高度,键盘弹起后,当前界面可用布局会减少键盘的高度
            int usableHeightNow = computeUsableHeight();
            //2、如果当前可用高度和原始值不一样
            if (usableHeightNow != usableHeightPrevious) {
                //3、获取Activity中xml中布局在当前界面显示的高度
                int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
                //4、Activity中xml布局的高度-当前可用高度
                int heightDifference = usableHeightSansKeyboard - usableHeightNow;
                //5、高度差大于屏幕1/4时,说明键盘弹出
                if (heightDifference > (usableHeightSansKeyboard/4)) {
                    // 6、键盘弹出了,Activity的xml布局高度应当减去键盘高度
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
                        frameLayoutParams.height = usableHeightSansKeyboard - heightDifference + statusBarHeight;
                    } else {
                        frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
                    }
                } else {
                    frameLayoutParams.height = contentHeight;
                }
                //7、 重绘Activity的xml布局
                mChildOfContent.requestLayout();
                usableHeightPrevious = usableHeightNow;
            }
        }
        private int computeUsableHeight() {
            Rect r = new Rect();
            mChildOfContent.getWindowVisibleDisplayFrame(r);
            // 全屏模式下:直接返回r.bottom,r.top其实是状态栏的高度
            return (r.bottom - r.top);
        }
    }
    

    (自己记录的属性可以忽略)
    在Manifest文件的每个Activity都可设置如下图:


    Manifest下Activity标签

    真正的沉浸式模式

    只有在Android 4.4及以上系统才支持沉浸式模式
    重写Activity的onWindowFocusChanged()方法

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        public void onWindowFocusChanged(boolean hasFocus) {
            super.onWindowFocusChanged(hasFocus);
            if (hasFocus && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                View decorView = getWindow().getDecorView();
                decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    //SYSTEM_UI_FLAG_LAYOUT_STABLE与SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN结合在一起使用,表示会让应用的主体内容占用系统状态栏的空间
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    //全屏的意思,也就是会将状态栏隐藏
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
            }
        }
    }
    

    界面默认情况下是全屏的,状态栏和导航栏都不会显示。当我们需要用到状态栏或导航栏时,只需要在屏幕顶部向下拉,或者在屏幕右侧向左拉,状态栏和导航栏就会显示出来,此时界面上任何元素的显示或大小都不会受影响。过一段时间后如果没有任何操作,状态栏和导航栏又会自动隐藏起来,重新回到全屏状态。

    Paste_Image.png

    隐藏导航栏

    View decorView = getWindow().getDecorView();
    //将状态栏和导航栏同时隐藏了
    int option = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_FULLSCREEN;
    decorView.setSystemUiVisibility(option);
    ActionBar actionBar = getSupportActionBar();
            if(actionBar != null){
                    //将actionBar隐藏
                    actionBar.hide();
            }
    

    看上去好像终于是完全全屏化,但其实在这种模式下,触摸屏幕的任意位置都会退出全屏。

    效果如图:

    Paste_Image.png

    实现透明状态栏和导航栏

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        View decorView = getWindow().getDecorView();
    //SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION,表示会让应用的主体内容占用系统导航栏的空间
        int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
        decorView.setSystemUiVisibility(option);
    //setNavigationBarColor()方法将导航栏设置成透明色
        getWindow().setNavigationBarColor(Color.TRANSPARENT);
        getWindow().setStatusBarColor(Color.TRANSPARENT);
    }
    ActionBar actionBar = getSupportActionBar();
            if(actionBar != null){
                    //将actionBar隐藏
                    actionBar.hide();
            }
    

    效果:

    Paste_Image.png


    作者:wyman_1007
    链接:https://www.jianshu.com/p/b54e02d60c4d
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
    展开全文
  • android 状态栏(StatusBar)

    万次阅读 2014-03-29 11:39:57
    一、SystemUI 概述  自 android2.2 开始 , 原本存在与 framework-res.apk 中的状态栏和下拉通知栏界面控制被分割出一个单独的 apk文件 , 命名为 SystemUI.apk, 保存在 System/app 文件夹中。...
  • statusBar控件

    千次阅读 热门讨论 2013-08-07 11:46:52
    最近在敲学生信息管理系统时,看到窗体最下边的一栏,那就是statusBar了.默认情况下被创建的状态栏只有一个本域,,但是我们需要多个文本域来显示多条信息,如下: statusBar.SetFieldsCount(3) statusBar.SetStatusWidths...
  • 工作几年下来,处理statubar的机会和场景不算多,每次遇到具体业务问题时,都是去网上找一些api解决当前问题,但是从来没有从根本上去了解statusbar的发展历程,今天下定决心去彻底认识statuabar。 了解statusbar的...
  • iOS iPhone X的StatusBar 高度

    万次阅读 2017-10-23 14:32:41
    在其他型号的iPhone上StatusBar是20 在iPhone X上StatusBar的高度是44, 当你设置了这个属性的时候: //Increasing navigation bar in iOS 11 navigationController?.navigationBar.prefersLargeTitles = true ...
  • cordova-plugin-statusbar状态栏设置整理

    万次阅读 2017-02-28 09:25:42
    一、Cordova StatusBar简介 1.全局对象StatusBar 提供了修改设备状态栏的方法,需要在deviceready事件之后使用。 2.iOS中接口都支持,Android支5.0以下版本持的相对较少,仅支持状态栏的显示show()和隐藏hide()。 3....
  • Qt状态栏(statusbar)的使用

    万次阅读 2018-01-20 08:47:45
    状态栏显示的信息分3种 1. 一般信息,用QLabel 代表 2. 永久信息,文本会一直显示在状态栏的最右边。 3. 临时信息,指定信息现实的时间。时间到即信息消失 //QLabel *locationLabel; locationLabel = new ...
  • Android获取设备状态栏高度的正确姿势正确代码方式: int height = 0; int resourceId = getApplicationContext...status_bar_height", "dimen", "android"); if (resourceId &gt; ...
  • “apple-mobile-web-app-status-bar-style”作用是控制状态栏显示样式 (默认样)具体效果如下: status-bar-style:black 默认样式
  • iOS Status Bar 状态栏颜色设置

    千次阅读 2018-08-22 10:28:42
    iOS Status Bar 状态栏颜色设置 状态栏分前后两部分: 文字部分: 指的是显示电池,时间等 背景部分: 就是显示黑色或者图片的背景部分 1. 设置Status Bar[文字部分] // 默认的黑色 UIStatusBarStyleDefault /...
  • 改变状态栏(StatusBar)的颜色

    千次阅读 2017-08-12 16:51:30
    全局修改状态栏的颜色 默认的情况下statusBar的颜色显示为黑色,如果我们想改为白色,那么可以如下操作: 1)打开项目的plist文件,设置View controller-based status bar appearance" 为 NO
  • View controller-based status bar appearance

    万次阅读 2014-10-09 11:51:11
    info.plist文件中,View controller-based status bar appearance项设为YES,则View controller对status bar的设置优先级高于application的设置。为NO则以application的设置为准,view controller的...
  • 在项目中发现Android和iOS在手机状态栏...1.下载插件$cordovaStatusbar命令: cordova plugin add https://github.com/apache/cordova-plugin-statusbar.git 2.在config.xml里面配置如下: 将此配置改为: (否则在
  • 1. 简介  在Android4.4.2中,
  • android statusbar隐藏的几种方式

    千次阅读 2018-05-04 11:39:07
    android statusbar 用来显示电池信号通知小图标等的最上部的条,隐藏它才能全屏,以下属性备忘以下。 View content = findViewById(R.id.content_view); content.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT...
  • iOS7下隐藏status bar的详细研究

    万次阅读 2014-01-17 14:31:41
    info.plist文件中,View controller-based status bar appearance项设为YES,则View controller对status bar的设置优先级高于application的设置。为NO则以application的设置为准,view controller的...
  • iOS6和iOS7代码的适配(2)——status bar

    万次阅读 2014-01-04 15:45:53
    用Xcode5运行一下应用,第一个看到的就是status bar的变化。在iOS6中,status bar是系统在处理,应用
1 2 3 4 5 ... 20
收藏数 102,015
精华内容 40,806
关键字:

statusbar