码迷,mamicode.com
首页 > 移动开发 > 详细

android4.3 SDK控制动态显示导航栏(NavigationBar)

时间:2015-08-25 21:50:05      阅读:1465      评论:0      收藏:0      [点我收藏+]

标签:

//--------------------------------------------------------------------------------------------

// 作者:longtian635241

// 发布日期:2015-08-25

// 最后修改:2015-08-25

//http://blog.csdn.net/longtian635241

//----------------------------------------------------------------------------------------------

1、android4.0开始应用中有提供API:view的setSystemUiVisibility(int visibility)方法实现动态操作状态栏;

这个借口的本意是提供给我们看视频时一段时间不操作而全屏,但触摸导航栏又出来了!入口怀疑是被系统劫持了触摸事件)

2、网上也有用广播去隐藏导航栏的,具体没有测试如:

http://blog.csdn.net/hdwslss/article/details/39497519

3、永久隐藏的方法

   3.1 在/system/build.prop或default.prop中添加

 qemu.hw.mainkeys=1
3.2 修改Z:\wk\myandroid\frameworks\base\core\res\res\values\config.xml(原始系统)如我的平台为freescale的imx6dq,修改Z:\wk\myandroid\device\fsl\sabresd_6dq\overlay\frameworks\base\core\res\res\values\config.xml中的
<bool name="config_showNavigationBar">true</bool>将true改为false!
4、动态隐藏修改
4.1 systemUI.apk启动过程:http://blog.csdn.net/andyhuabing/article/details/12851825

  4.2 最后确定frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java,在调用setSystemUiVisibility后会调用private int updateSystemUiVisibilityLw()其在finishPostLayoutPolicyLw中调用!可以看到隐藏状态栏的代码!
        4.3 寻找劫持触摸事件,由按键知道一般会在interceptKeyBeforeDispatching去劫持分发,但是么有发现和导航栏有关的信息,再次搜所输入事件接收器InputEventReceiver,这是我们发现HideNavInputEventReceiver这个类,它就是劫持输入事件的类!在其下面初始化了一个变量:
final InputEventReceiver.Factory mHideNavInputEventReceiverFactory =
            new InputEventReceiver.Factory() {
        @Override
        public InputEventReceiver createInputEventReceiver(
                InputChannel inputChannel, Looper looper) {
            return new HideNavInputEventReceiver(inputChannel, looper);
        }
    };
上面变量的使用在:
public void beginLayoutLw(boolean isDefaultDisplay, int displayWidth, int displayHeight,
                              int displayRotation) {
。。。。。。。。。。。。。。。。。。
  if (navVisible) {
                if (mHideNavFakeWindow != null) {
                    mHideNavFakeWindow.dismiss();
                    mHideNavFakeWindow = null;
                }
            } else if (mHideNavFakeWindow == null) {
                mHideNavFakeWindow = mWindowManagerFuncs.addFakeWindow(
                        mHandler.getLooper(), mHideNavInputEventReceiverFactory,
                        "hidden nav", WindowManager.LayoutParams.TYPE_HIDDEN_NAV_CONSUMER,
                        0, false, false, true);//此处被调用
            }


            // For purposes of positioning and showing the nav bar, if we have
            // decided that it can‘t be hidden (because of the screen aspect ratio),
            // then take that into account.
            navVisible |= !mCanHideNavigationBar;
。。。。。。。。。。。。。。
}
当然很自然到注释他,果然注释即可!
5、FakeWindow扩展
http://m.blog.csdn.net/blog/sundesheng125/24478833

其他参考资料:
http://www.cnblogs.com/android100/archive/2012/06/20/2556577.html
http://www.myexception.cn/android/1307491.html
http://blog.csdn.net/chenqian_lj/article/details/17719903
http://blog.csdn.net/chaihuasong/article/details/31741659
http://blog.csdn.net/chenqian_lj/article/details/22388367


版权声明:本文为博主原创文章,未经博主允许不得转载。

android4.3 SDK控制动态显示导航栏(NavigationBar)

标签:

原文地址:http://blog.csdn.net/longtian635241/article/details/47981603

(2)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!