zoukankan      html  css  js  c++  java
  • 【转】Android 全屏方案(隐藏NavigationBar)

    http://www.07net01.com/2015/04/822292.html

    android4.0及其以上的版本中,出现了一个很屌的东西,叫做Navigation Bar,它和Status Bar

    一上一下相互交映,影响了我们的全屏。如果还不知道Navigation Bar是个毛,请看下图:

    navigation-bar

    1. 低级隐藏

    这个东西其实是可以隐藏和显示的,下面是Google给出的方法,此方法必须在Android 4.0以上

    的系统中使用,当然4.0以下也没有(也就是api14),直接把这段代码粘贴在,你的Activity的

    onCreate()方法中就可以了:

    View decorView = getWindow().getDecorView();
    // Hide both the navigation bar and the status bar.
    // system_UI_FLAG_FULLSCREEN is only available on Android 4.1 and higher, but as
    // a general rule, you should design your app to hide the status bar whenever you
    // hide the navigation bar.
    int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                  | View.SYSTEM_UI_FLAG_FULLSCREEN;
    decorView.setSystemUiVisibility(uiOptions);
    

    但是这么做是有缺陷的,Google共给出了5个注意事项,我只看懂以下介个:

    a) 使用这种设置flag的方式虽然暂时隐藏了Navigation Bar,但是用户触摸屏幕的任何地方

    flags将会被清除,也就是说你的设置,在用户触摸屏幕后会失效

    b) 一但你设置的flags被清除后,如果你再想隐藏Navigation Bar,需要重新设置,这个需要

    监听一个事件,看文章最后:

    c) 你设置UI flags的位置很重要,也就是上面的代码的放置位置,如果你放到onCreate()方法

    中的时候,如果用户通过Home键回到桌面,当你重新打开的时候,由于这是onCreate()

    方法不会再次被调用,所以Navigation Bar 不再隐藏。如果你想要你的设置在上面的情况

    有效你需要在 onResume() or onWindowFocusChanged()

    中设置UI flags

    d)The method setSystemUiVisibility() only has an effect if the view you call it

    from is visible.(哥实在是翻译不出来,也没看懂)我的翻译:只有你调用setSystemUiVisibility()

    这个方法的View是可见状态下的时候,这个方法才会起作用。我们都知道,其实Activity的显示是有一个View的

    对,就是那个从window中调用的getDecorView()方法,每个Activity都有一个decorview对象,这个就是Activity

    的渲染机制了。

    e) Navigating away from the view causes flags set with setSystemUiVisibility() to be cleared.

    (额,这句英语也是屌的不行)同样我的翻译:

    当导航离开这个View的时候会使得通过 setSystemUiVisibility()

    这个方法设置的flags被清除,也就是说所有的在这个view上设置的全屏和隐藏NavigationBar的flag都将失效。

    高级解决方案,通过按钮事件控制Navigation Bar的显示和隐藏

    看下面的代码来自Google的Example,只要在按钮中调用这个方法,就可以随意切换

    显示和隐藏Navigation Bar了

    /**
         * Detects and toggles immersive mode (also known as "hidey bar" mode).
         */
        public void toggleHideyBar() {
     
            // The UI options currently enabled are represented by a bitfield.
            // getSystemUiVisibility() gives us that bitfield.
            int uiOptions = getWindow().getDecorView().getSystemUiVisibility();
            int newUiOptions = uiOptions;
            boolean isImmersiveModeEnabled =
                    ((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);
            if (isImmersiveModeEnabled) {
                Log.i(TAG, "Turning immersive mode mode off. ");
            } else {
                Log.i(TAG, "Turning immersive mode mode on.");
            }
     
            // Navigation bar hiding:  Backwards compatible to ICS.
            if (Build.version.SDK_INT >= 14) {
                newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
            }
     
            // Status bar hiding: Backwards compatible to Jellybean
            if (Build.VERSION.SDK_INT >= 16) {
                newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
            }
     
            // Immersive mode: Backward compatible to KitKat.
            // Note that this flag doesn't do anything by itself, it only augments the behavior
            // of HIDE_NAVIGATION and FLAG_FULLSCREEN.  For the purposes of this sample
            // all three flags are being toggled together.
            // Note that there are two immersive mode UI flags, one of which is referred to as "sticky".
            // Sticky immersive mode differs in that it makes the navigation and status bars
            // semi-transparent, and the UI flag does not get cleared when the user interacts with
            // the screen.
            if (Build.VERSION.SDK_INT >= 18) {
                newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
            }
     
            getWindow().getDecorView().setSystemUiVisibility(newUiOptions);
        }
    
    

    Navigation Bar 透明遮挡内容

    Android 越出越牛X,当Android4.1以后的版本,如果不是必须,不一定非要把他隐藏掉

    因为这时候那个你的内容View可以放到Navigation Bar 后面,索引这个时候当navigation bar

    显示或者隐藏的时候,不会引起你的内容View重新计算大小。你可以使用SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION.

    和 SYSTEM_UI_FLAG_LAYOUT_STABLE来实现。(个人目测这个用途不是太大吧)

    Android 4.4Immersive Mode“沉浸式全屏”

    这个比较好玩,Status Bar 和 Navigation Bar 是以透明的方式显示的,但是这个要在api 19 之上使用。

    沉浸式全屏是什么意思?就是支持沉浸式全屏的应用在Android 4.4的手机上会自动全屏显示,并不会出现恼人的虚拟键

    而当我们需要虚拟键的时候,只要在屏幕底部轻轻滑动一下即可调出虚拟键,而且虚拟键是以透明的状态显示的。

    Android 4.4 中提供了 IMMERSIVE 和 IMMERSIVE_STICKY 标记, 可以用这两个标记与

    SYSTEM_UI_FLAG_HIDE_NAVIGATION 和 SYSTEM_UI_FLAG_FULLSCREEN 一起使用, 来实现沉 浸模式。

    一个对沉浸模式的理解点击这里

    监听事件的方式获取屏幕Navigation Bar的变化,然后做出不同的处理

    private static Handler sHandler;  
      
    protected void onCreate(Bundle savedInstanceState){    
        super.onCreate(savedInstanceState);     
      
        sHandler = new Handler();  
          
        sHandler.post(mHideRunnable); // hide the navigation bar  
      
        final View decorView = getWindow().getDecorView();  
        decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener()  
            {  
                @Override  
                public void onSystemUiVisibilityChange(int visibility)  
                {  
                    sHandler.post(mHideRunnable); // hide the navigation bar  
                }  
            });          
    }  
      
    Runnable mHideRunnable = new Runnable() {  
        @Override  
        public void run() {  
            int flags;    
            int curApiVersion = android.os.Build.VERSION.SDK_INT;  
            // This work only for android 4.4+  
            if(curApiVersion >= Build.VERSION_CODES.KITKAT){  
                // This work only for android 4.4+  
                // hide navigation bar permanently in android activity  
                // touch the screen, the navigation bar will not show  
                flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION  
                      | View.SYSTEM_UI_FLAG_IMMERSIVE  
                      | View.SYSTEM_UI_FLAG_FULLSCREEN;  
                      
            }else{  
                // touch the screen, the navigation bar will show  
                flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;  
            }  
              
            // must be executed in main thread 

    :)

      
            getWindow().getDecorView().setSystemUiVisibility(flags);  
        }  
    };    
    
    
  • 相关阅读:
    微信WeixinJSBridge API
    微信内置浏览器的JsAPI(WeixinJSBridge续)[转载]
    一套简单可依赖的Javascript库
    一款轻量级移动web开发框架
    传说中的WeixinJSBridge和微信rest接口
    点击网页分享按钮,触发微信分享功能
    Metronic前端模板
    AdminLTE前端模板
    Nginx如何配置静态文件直接访问
    架构设计流程
  • 原文地址:https://www.cnblogs.com/exmyth/p/5364381.html
Copyright © 2011-2022 走看看