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时会一直位于中间。
网友评论