Android系统UI——System Bars

来源:互联网 发布:windows nt4.0 编辑:程序博客网 时间:2024/05/16 11:16

System Bars 包括:

1) status bar,也就是顶部包含显示时间、电量、通知等信息

2) Navigation Bar,底部包含 back 键、home 键以及 recent 键

status bar:

一、隐藏status bar

1.在android4.0及以下版本中

1)status bar是一直隐藏的话,在manifest中设置activity的theme。

android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"

设置activity的theme的优点:a.简单不易出错。b.UI切换更流畅。因为系统在实例化activity之前已经获得了渲染UI所需要的信息。

2)在java代码中设置WindowManager的flag:

if ( Build.VERSION.SDK_INT<16 ) {

     getWindow( ).setFlags ( WindowManager.LayoutParams.FLAG_FULLSCREEN,

     WindowManager.LayoutParams.FLAG_FULLSCREEN ) ; }

当设置了WindowManager 的 flag,将一直保持该flag的效果,除非重置了flag。之所以强调这点是因为下面要讲的内容中会出现设置了某个状态但是不一定一直该保持状态。

但是在status bar切换隐藏和显示状态的同时,activity的界面会发生重新分配UI的情况,而系统在UI重绘时并没有做到视觉上的连续,看起来有点卡顿的错觉。为了防止这种情况发生,使用FLAG_LAYOUT_IN_SCREEN。

2.在4.0以上版本中

在 Android 4.1 (API level 16) 或者更高版本中,你可以使用 setSystemUiVisibility() 来隐藏 status bar,使用 setSystemUiVisibility() 设置 UI flag 比使用 WindowManager 的 flag 拥有更多的控制选项。

View  decorView = getWindow().getDecorView();

int  uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN |  View.SYSTEM_UI_FLAG_LAYOUT_STABLE;// Hide the status bar.

decorView.setSystemUiVisibility ( uiOptions ) ;// status bar隐藏时,action bar最好一起隐藏

ActionBar actionBar = getActionBar () ;

actionBar.hide();

一旦 UI Flag 被清除(比如跳转到另外的activity),需要重新设置UI flag来隐藏system bar。可监听 UI visibility 的改变,以便在改变的同时让app的界面也做必要的改变。

以下是使用 setSystemUiVisibility() 方法时需要注意的地方:

1)在不同的地方设置 UI flag 是有区别的,如果是在 onCreate 中设置 UI flag 隐藏 system bar,当用户点击 home 键,system bar 将重新出现,用户重新回到这个 activity 的时候,onCreate 是不会被调用的,所以 system bar 仍然是可见的。因此如果你想在 activity 切换回来的时候仍然保持 system bar 的状态,最好是在 onResume() 或者onWindowFocusChanged() 方法中设置 UI flag。

2)只有当调用 setSystemUiVisibility() 的 view 是可见的 setSystemUiVisibility() 才会起作用。

3)界面的切换会导致 setSystemUiVisibility() 的设置被清空。

三、让内容布局在status bar的背后

在 android4.1 以及之后的版本,可以让 activity 的内容部分显示在 status bar 的背后,status bar 不再影响到实际内容的空间摆放(以前实际内容总是在status bar下面),因此在status bar切换显示状态的时候,内容区域的大小就不会发生变化。使用SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 标志(flag)。同时需要SYSTEM_UI_FLAG_LAYOUT_STABLE 标志维持一个稳定的布局。

因为内容区域在 status bar 之后,若要确保 app 不被 status bar挡住需要操作的区域,在布局文件中添加 android:fitsSystemWindows 属性(值为true)可以解决status bar 挡住内容区域的问题,因为该设置可以调整 viewGroup 的 padding,为系统控件预留一定的区域。

注:既然我们反正都需要预留空间给status bar 为什么我们还需要将内容区域显示在status bar的后面呢?这一般是为了满足这种需求:在一个显示图片的 GridView 中,当GridView 滚动的时候,我们希望 status bar 背后是有内容在滚动的,但是当 GridView 滑到了顶端,我又希望 GridView 是没有被status bar挡住的。

在一些情况下,可能需要修改默认的padding大小来获取合适的布局。为了控制内容区域的布局相对系统栏(它占据了一个叫做“内容嵌入”content insets的区域)的位置,可以重写 fitSystemWindows (Rect insets) 方法。当窗口的内容嵌入区域发生变化时,fitSystemWindows() 方法会被 view 的 hierarchy 调用,让 View 做出相应的调整适应。重写这个方法你就可以按你的意愿处理嵌入区域与应用的布局。

四、同步status bar与Action Bar的变化

在Android 4.1及以上的版本,为了防止在 Action Bar 隐藏和显示的时候布局发生变化,可以使用 Action Bar 的 overlay 模式。在 Overlay 模式中,Activity 的布局占据了所有可能的空间,好像Action Bar不存在一样,系统会在布局的上方绘制 Aciton Bar。虽然这会遮盖住上方的一些布局,但是当 Action Bar 显示或者隐藏的时候,系统就不需要重新改变布局区域的大小。

要启用 Action Bar 的 overlay 模式,需要创建一个继承自 Action Bar 主题的自定义主题,将 android:windowActionBarOverlay 属性设置为 true。

View 设置 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 使用的屏幕区域与SYSTEM_UI_FLAG_FULLSCREEN 相同。当需要隐藏系统UI时,同时隐藏Action Bar(因为 windowActionBarOverlay="true")使用SYSTEM_UI_FLAG_FULLSCREEN 。这个操作同时显示与隐藏ActionBar与状态栏的时候,还会使用一个动画来让他们相互协调。

Navigation Bar:

一、在4.0及以上版本中隐藏导航栏

Android 4.0以及以上版本,使用 SYSTEM_UI_FLAG_HIDE_NAVIGATION 标志来隐藏导航栏。

View decorView = getWindow().getDecorView();

// SYSTEM_UI_FLAG_FULLSCREEN 隐藏 navigation bar and the status bar 仅在Android 4.1及以上版本中

intuiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION

 | View.SYSTEM_UI_FLAG_FULLSCREEN;

decorView.setSystemUiVisibility ( uiOptions );

注意以下几点

1)使用这个方法时,触摸屏幕的任何一个区域都是使导航栏(与状态栏)重新显示。用户的交互使这个标志SYSTEM_UI_FLAG_HIDE_NAVIGATION被清除。

2)一旦这个标志被清除了,如果你想再次隐藏导航栏,你就需要重新对这个标志进行设定。在下一节响应UI可见性的变化中,将详细讲解应用监听系统UI变化来做出相应的调整操作。

3)在不同的地方设置UI标签是有所区别的。如果在 activity 的 onCreate() 方法中隐藏系统栏,当用户按下 home 键系统栏就会重新显示。当用户再重新打开 activity 的时候,onCreate() 不会被调用,所以系统栏还会保持可见。如果想让在不同 activity 之间切换时,系统 UI 保持不变,需要在 onReasume() 与 onWindowFocusChaned() 里设定 UI 标签。

4)setSystemUiVisibility() 仅仅在被调用的 View 显示的时候才会生效。

5)当从View导航到别的地方时,用 setSystemUiVisibility() 设置的标签会被清除。

二、让内容显示在导航栏之后

在Android 4.1与更高的版本中,使用SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION标志来做到这个效果。同时需要SYSTEM_UI_FLAG_LAYOUT_STABLE 标志来维持一个稳定的布局。

当你使用这种方法的时候,就需要确保应用中特定区域不会被系统栏掩盖。更详细的信息可以浏览隐藏状态栏一文。

全屏沉浸模式(Using Immersive Full-Screen Mode):

android4.4 及以上版本中为 setSystemUiVisibility() 方法引入了一个新的flag:SYSTEM_UI_FLAG_IMMERSIVE,实现真正意义上的全屏。当SYSTEM_UI_FLAG_IMMERSIVE、SYSTEM_UI_FLAG_HIDE_NAVIGATION和SYSTEM_UI_FLAG_FULLSCREEN 三个 flag 一起使用的时候,可以隐藏状态栏与导航栏,同时可以捕捉到用户的所有触摸屏事件。

原创粉丝点击