Android 控制系统UI

来源:互联网 发布:护眼显示器 知乎 编辑:程序博客网 时间:2024/05/21 18:41

在实际应用中我们经常要控制系统的UI,比如顶部栏等,来达到预期的效果,如何控制系统UI呢? 让我们一探究竟

使 系统的Bar 不可见

让 System bar 变的不可见,只有在 Android 4.0 之后的版本可以。

这种效果并不是完全的隐藏 System bar,而是 dim,就是当没有触摸事件的时候,慢慢隐藏,一旦用户产生输入,则再次显示 reveal

渐隐

使用 以下代码 达到目的:

// 代码中设定的是view,也就是可以让点击恢复的viewView decorView = getActivity().getWindow().getDecorView();int uiOptions = View.SYSTEM_UI_FLAG_LOW_PROFILE;decorView.setSystemUiVisibility(uiOptions);

要注意的是,每次用户点击界面,都会清除这个 SYSTEM.UI.FLAG_LOW_PROFILE , 如果你需要再次隐藏,那么你必须再次设置flag

如果需要程序性的设置 重新显示,而不是接触touch,可以如下:

View decorView = getActivity().getWindow().getDecorView();// Calling setSystemUiVisibility() with a value of 0 clears// all flags.decorView.setSystemUiVisibility(0);

隐藏 Status Bar 和 navigation Bar

在android4.0以下的版本隐藏

两种方式:

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

或者

public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // If the Android version is lower than Jellybean, use this call to hide        // the status bar.        if (Build.VERSION.SDK_INT < 16) {            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                    WindowManager.LayoutParams.FLAG_FULLSCREEN);        }        setContentView(R.layout.activity_main);    }    ...}

在 4.0 之上的版本

View decorView = getWindow().getDecorView();// 隐藏状态条int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;decorView.setSystemUiVisibility(uiOptions);// 如果你隐藏了你的状态条,那么一定记着也要影藏你的 导航条ActionBar actionBar = getActionBar();actionBar.hide();

值得注意的几点:

  1. 一旦 UI flag 被清除了,那么你需要 重置
  2. (重要)使用 UI flag 造成变化,但是如果你把代码写在 onCreate() 方法中,如果用户 重新打开 Activity的时候,onCreate 方法是不会调用的。所以最好是写在 onResume 或者 onWindowFocusChanged 方法中
  3. setSystemUIVisibility 这个方法调用,只有当你的view是可见的时候,才有效
  4. 从View 导航离开会到时 flag 被清除

隐藏底部导航条

基本和隐藏顶部的是一样的,就是对应的flag不同


Android 4.4 之后的 沉浸式 全屏幕模式

android 4.4 之后,可以使用 SYSTEM_UI_FLAG_IMMERSIVE 这个flag 来使你的app 实现真正的 全屏幕,这个flag是结合 隐藏底部导航条,和隐藏头部状态条两个的

当这个状态开启之后,你的app还是接受所有的触摸事件,你可以设置 SYSTEM_UI_FLAG_IMMERSIVE_STICKY 利用这个flag,可以设置过几分钟后再次自动的隐藏

如果你使用的是 SYSTEM_UI_FLAG_IMMERSIVE 那么它是根据你如何设置其他的flag来决定隐藏的效果的

其他的一些flags,是为了在隐藏和显示中间,避免 内容 resizing

private void hideSystemUI() {    // Set the IMMERSIVE flag.    // Set the content to appear under the system bars so that the content    // doesn't resize when the system bars hide and show.    mDecorView.setSystemUiVisibility(            View.SYSTEM_UI_FLAG_LAYOUT_STABLE            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar            | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar            | View.SYSTEM_UI_FLAG_IMMERSIVE);}private void showSystemUI() {    mDecorView.setSystemUiVisibility(            View.SYSTEM_UI_FLAG_LAYOUT_STABLE            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);}

粘性沉浸

如果有手势操作,那么bars会以半透明的形式显示出来,然后一会又会自动的隐藏起来

@Overridepublic void onWindowFocusChanged(boolean hasFocus) {        super.onWindowFocusChanged(hasFocus);    if (hasFocus) {        decorView.setSystemUiVisibility(                View.SYSTEM_UI_FLAG_LAYOUT_STABLE                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION                | View.SYSTEM_UI_FLAG_FULLSCREEN                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);}}

屏幕的变化是可监控的

只要注册函数 View.OnSystemUiVisibilityChangeListener 到你的view就可以了

0 0
原创粉丝点击