美文网首页
沉浸式状态栏和透明状态栏学习

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

作者: coderchang | 来源:发表于2016-08-04 13:43 被阅读323次

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

    • 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 中可以看到代码

    相关文章

      网友评论

          本文标题:沉浸式状态栏和透明状态栏学习

          本文链接:https://www.haomeiwen.com/subject/ugpqsttx.html