2.切换系统UI元素

作者: Jennyni1122 | 来源:发表于2018-09-04 09:37 被阅读11次

    2.1 问题

    你的应用程序体验需要对显示进行控制,移除各种系统修饰,例如状态栏和软件导航按钮。

    2.2解决方案

    (API Level11)
    在应用程序的内容可见时,通过暂时隐藏系统UI组件,从而尽可能地提供更大的屏幕空间,可以让很多应用程序(例如阅读器或视频播放器)呈现更好的内容体验。从Android3.0开始,开发人员可以在运行是动态地调整这些属性,而不必再静态地请求窗口特性或声明主题内的值。

    2.3实现机制

    夜间模式
    夜间模式通常也称为“熄灯模式”,指的是调暗屏幕导航控件(以及稍后发布版本中的系统状态栏),而不是真正移除它们来减少屏幕上的系统元素(这些元素可能会将用户的注意力从应用程序的当前视图中分散出去)。
    要启用这个模式,只需要简单地在视图结构中的任何视图中使用SYSTEM_UI_FLAG_LOW_PROFILE标识调用setSystemUiVisibility()即可。而要想恢复到默认模式,需要以SYSTEM_UI_FLAG_VISIBLE调用同样的方法。通过调用getSystemUiVisibility()并检查标识的当前状态,就可以知道我们现在所处的模式了(参见以下两段代码)。

    注意:
    这些标识名称都是在API Level14(Android 4.0)中引入的,在之前的版本中,它们名为STATUS_BAR_HIDDEN和STATUS_BAR_VISIBLE。它们的值都是一样的,所有新的标识在Android3.x设备上也可以实现相同的功能。
    res/layout/activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:text="Toggle Mode"
            android:onClick="onToggleClick" />
    </RelativeLayout>
    

    开关夜间模式的Activity

    public class DarkActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
        
        public void onToggleClick(View v) {
            int currentVis = v.getSystemUiVisibility();
            int newVis;
            if ((currentVis & View.SYSTEM_UI_FLAG_LOW_PROFILE) == View.SYSTEM_UI_FLAG_LOW_PROFILE) {
                newVis = View.SYSTEM_UI_FLAG_VISIBLE;
            } else {
                newVis = View.SYSTEM_UI_FLAG_LOW_PROFILE;
            }
            v.setSystemUiVisibility(newVis);
        }
    }
    

    要调节这些参数的窗口中所有可见的视图,可以调用setSystemUiVisibility()和getSystemUiVisibility()方法。

    1.隐藏导航控件

    (API Level14)
    SYSTEM_UI_FLAG_HIDE_NAVIGATION标识会移除没有物理按钮的设备屏幕上的HOME和BACK控件。Android赋予开发人员这个功能时是非常谨慎的,因为这个功能对于用户来说太重要了。如果导航控件被手动隐藏,屏幕上的任何点击都会回到上一界面。
    开关导航控件的Activity

    public class HideActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
        
        public void onToggleClick(View v) {
            //这里我们只需要点击屏幕即可隐藏控件,因为控件隐藏后,
            // 只要再点击一下屏幕,Android系统就会让控件自动重新出现
            v.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
        }
    }
    

    运行这个示例时还需要注意的是,因为我们是在根布局中进行设置,所以按钮会上下移动来适应内容区域的改变。如果你打算使用这个标识,需要注意在布局改变时所有位于屏幕底部的视图都会移动。

    2.全屏UI模式

    Android4.1之前是没有办法动态地隐藏系统状态栏的,只能通过设置静态主题来实现。在隐藏和显示ActionBar时,ActionBar.show()和ActionBar.hide()会动态地显示和隐藏ActionBar元素。如果请求的是FEATURE_ACTION_BAR_OVERLAY,页面的变化将不会影响到Activity的内容;否则,视图的内容会上下移动来适应这种变化。
    (API Level16)
    以下代码演示了一个如何暂时隐藏所有系统UI控件的示例。
    开关所有系统UI控件的Activity

    public class FullActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //请求这个特性,这样ActionBar就会隐藏起来
            supportRequestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
            setContentView(R.layout.main);
    
        }
        
        public void onToggleClick(View v) {
            //这里我们只需要点击屏幕即可隐藏UI,因为控件隐藏后,
            // 只要再点击一下屏幕,Android系统就会让控件自动重新出现
            v.setSystemUiVisibility(
                    /* 这个标识会告诉Android在改变窗口大小来
                     * 隐藏/显示系统元素时不要移动我们的布局
                     */
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    /* 这个标识会隐藏系统状态栏。如果请求ACTION_BAR_OVERLAY,f
                     *同时会隐藏ActionBar
                     */
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    /* 这个标识会隐藏屏幕上的所有控件
                     */
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
        }
    }
    

    与只隐藏导航控件的示例类似,我们不需要再次显示控件,因为任何屏幕上的点击都会让它们再次显示出来。作为Android4.1的一个便捷之处,在系统通过这种方式清除SYSTEM_UI_FLAG_HIDE_NAVIGATION后,同时会清除SYSTEM_UI_FLAG_FULLSCREEN标识,所以顶部和底部的元素会一起可见。如果我们请求了FEATURE_ACTION_BAR_OVERLAY,Android将会隐藏作为全屏标识一部分的ActionBar;否则,只会影响到状态栏。
    我们能在这个示例中添加另一个有趣的标识:SYSTEM_UI_LAYOUT_STABLE。这个标识会通知Android在添加和移除系统UI时不要移动我们的内容视图。正因为如此,我们的按钮在开关UI时会一直位于中间。

    相关文章

      网友评论

        本文标题:2.切换系统UI元素

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